如何编写约束为特定类型属性的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
相关产品推荐
相关产品推荐

