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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:09