如何用TypeScript泛型根据第一个参数的可选属性推断第二个参数
解决TypeScript根据类的data属性推断参数类型的问题
要实现根据第一个参数类的data属性类型自动推断第二个参数的类型,你需要用**条件类型+类型推断(infer)**来定义DialogHavingData:
type DialogHavingData<T> = T extends { data: infer U } ? U : any;
类型说明
- 当泛型
T包含data属性时,通过infer U提取data的具体类型作为返回值; - 当
T没有data属性时,返回any,允许第二个参数传入任意值。
完整代码示例
type DialogHavingData<T> = T extends { data: infer U } ? U : any; class MyDialog { data: { prop1: string; prop2?: string; prop3: { name: string; age?: number; } }; } class MyDialog2 { // 无data属性 } function createDialogFromClass<T>(dClass: T, payload: DialogHavingData<T>) { // 实现代码... } // MyDialog有data属性,第二个参数必须匹配其类型 createDialogFromClass(MyDialog, { prop1: "my string", prop3: { name: "Test Name", age: 12 } // TypeScript会自动校验:prop1为必填项,prop2为可选 }) // MyDialog2无data属性,第二个参数允许任意值 createDialogFromClass(MyDialog2, null) createDialogFromClass(MyDialog2, {test: "My test dialog"});
优化点说明
原函数的双泛型参数可以简化为单个泛型T,因为payload的类型可以直接由DialogHavingData<T>推断,无需额外声明Y泛型,这样代码更简洁且类型推断更准确。
内容的提问来源于stack exchange,提问作者Lothre1
相关产品推荐
相关产品推荐

