【发布时间】:2019-03-18 06:49:21
【问题描述】:
试图将我的头脑围绕泛型并想知道我是否在此处正确应用它。
考虑以下几点:
interface NameValuePair {
name: string;
value: string;
}
function flatten(data: NameValuePair[]) {
return data.reduce((obj, pair: NameValuePair) => {
obj[pair.name] = pair.value;
return obj;
}, {});
}
const formData: NameValuePair[] = [
{ name: "firstName", value: "John" },
{ name: "lastName", value: "Doe" }
];
let flattened = flatten(formData);
// { firstName: "John", lastName: "Doe" }
每当调用该函数时,我希望 Typescript 强制使用描述最终数据结构的自定义接口。例如,使用上面的formData,可能的界面可能如下所示:
interface ProfileForm {
firstName: string;
lastName: string;
}
以下是我使用泛型的尝试:
function flatten<T>(formData: NameValuePair[]): T {
return <T>formData.reduce((obj: T, pair: NameValuePair) => {
obj[pair.name] = pair.value;
return obj;
}, {});
}
let flattened = flatten<ProfileForm>(formData);
let firstName = flattened.firstName;
let age = flattened.age; // typescript error
它按预期工作,但通过测试,它似乎提供了与以下相同的结果:
function flatten(formData: NameValuePair[]) {
return formData.reduce((obj, pair: NameValuePair) => {
obj[pair.name] = pair.value;
return obj;
}, {});
}
let flattened = <ProfileForm>flatten(formData);
let firstName = flattened.firstName;
let age = flattened.age; // typescript error
在这种特殊情况下,泛型有什么好处吗?
【问题讨论】:
-
我正在写答案,但你能说出你的真实意图吗?你想用 TypeScript 解决什么问题?为什么要拥有这样的接口?
-
主要思想是强制任何使用 flatten() 函数的人提供一个接口来映射返回值。具体来说,flatten() 用于将表单转换为 JSON 对象。每种形式都不同,具有不同的字段。我想,既然 Typescript 是一种类型化语言,那么这种强制执行就是该语言的目的所在。我对类型强制的想法是否太过分了?
-
好的。您是否尝试过我的答案中的解决方案?
标签: typescript typescript-generics