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

如何编写约束为特定类型属性的TypeScript泛型函数?

约束函数参数为对象中类型是Date/undefined的属性

你已经通过Dates<T>类型正确筛选出了对象中属性类型为Date或undefined的键,接下来只需要修改函数的参数约束,把key的类型从宽泛的keyof T限制为keyof Dates<T>即可:

type Dates<T> = {
    [P in keyof T as T[P] extends Date | undefined ? P : never]: T[P]
};

function doSomething<T>(inst: T, key: keyof Dates<T>) {
    const date = inst[key];
    // 此时date的类型自动推导为Date | undefined,可安全调用Date相关方法
    if (date) {
        console.log(date.getFullYear());
    }
}

原理说明

keyof Dates<T>会自动提取Dates<T>中的所有键,也就是原对象T中属性类型为Date或undefined的那些属性名。当你把key约束为这个类型后,TypeScript就能明确知道inst[key]的类型范围,自动完成类型推导,无需额外断言。

如果不想依赖Dates<T>类型,也可以直接在函数泛型中用条件类型实现约束:

function doSomething<T, K extends keyof T>(
    inst: T, 
    key: K extends (T[K] extends Date | undefined ? K : never) ? K : never
) {
    const date = inst[key];
}

但第一种写法借助已定义的Dates<T>,代码可读性更高。

内容的提问来源于stack exchange,提问作者malthe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:41:01