You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:01:09