【发布时间】:2022-01-13 19:54:27
【问题描述】:
问题
如何在函数的类型注释中提取对象的属性及其泛型类型?
我需要能够推断出RequestData 的类型,以便该类型正确传播到request 回调。
目前在调用此函数时,我必须使用类型断言编写我的 request 回调。我希望我的 IDE 根据传入的 Form 对象推断 data 的类型。
此外,感谢任何关于如何在我的示例中摆脱 any 的建议。
谢谢!
示例
class Field<T> {
value: T;
constructor(value: T) {
this.value = value;
}
}
class Form {
// Object containing all Field objects in this Form
fields: Record<string, Field<any>>;
constructor({ fields }: { fields: Record<string, Field<any>>; ) {
this.fields = fields;
}
}
const submit = async <Response extends unknown, RequestData extends Record<string, unknown>>(
form: Form,
request: (data: RequestData) => Promise<Response>,
): Promise<Response> => {
const fieldsAsGenerics = {} as RequestData; // Extract value stored in every form.field
return await request(fieldsAsGenerics);
};
const myForm = new Form({
fields: {
name: new Field<string>('Charlie'),
age: new Field<number | null>(66),
}
});
submit(myForm, async (data) => {
// data should be of type { [K in keyof typeof myForm.fields]: typeof myForm.fields[K] }
// which in this case is { name: string; age: number | null }
// Actual type is unknown
});
另见
【问题讨论】:
-
对于 Typescript 问题,您可能需要考虑链接到 Typescript playground。回答者运行您的代码变得更快:)
-
谢谢@Mack!我刚刚添加了游乐场链接
标签: typescript typescript-generics