TypeScript如何编写适配含多类型属性对象的泛型约束
TypeScript 泛型约束修改方案
核心修改点
- 放宽泛型
T的约束,无需强制所有属性为string类型,仅约束T为普通对象即可 - 优化
StringProps类型逻辑,适配可选属性的识别,避免可选string属性被过滤
修改后完整代码
// 优化后StringProps:排除属性值的undefined类型,适配可选string属性识别 type StringProps<T> = { [K in keyof T]: NonNullable<T[K]> extends string ? K : never }[keyof T]; // 泛型约束改为T extends object,支持任意结构的对象入参 public someFunction<T extends object>(list: T[], props: StringProps<T>[]): void { // 增加类型守卫过滤undefined,保证foo数组元素全为string,无类型风险 const foo: string[] = list.flatMap(item => props.map(prop => item[prop]).filter((val): val is string => typeof val === 'string') ); // 剩余业务逻辑 }
验证效果
针对你给出的测试对象结构,可以直接正常调用:
type User = { age?: number, name?: string, } const userList: User[] = [ {age: 18, name: '张三'}, {age: 20, name: undefined} ]; // 类型校验正常:props仅允许传入值为string类型的键name,传入age会直接触发类型报错 someFunction(userList, ['name']);
内容的提问来源于stack exchange,提问作者Henny Lee
相关产品推荐
相关产品推荐

