如何确保对象成员值匹配TypeScript泛型类型
如何基于对象字段类型构造严格匹配的对象数组?
你需要让name和values的类型形成关联绑定,而非当前的松散联合类型。可以通过将Properties定义为泛型联合类型来实现:
type Values = { foo: boolean, bar: string } // 遍历Type的每个键,为每个键生成严格匹配的类型 type Properties<Type> = { [K in keyof Type]: { name: K; values: Type[K][]; } }[keyof Type]; const properties: Properties<Values>[] = [ { name: 'foo', // TS会报错:类型“string”不能赋值给类型“boolean” values: [true, 'false'], }, { name: 'bar', // 类型校验通过 values: ['hello', 'goodbye'], } ];
原理说明
[K in keyof Type]遍历目标类型的每个键K,为每个键单独生成一个类型:name固定为当前键K,values的类型严格对应Type[K]的数组。[keyof Type]将上述映射类型转换为联合类型,此时Properties<Values>等价于{name: 'foo', values: boolean[]} | {name: 'bar', values: string[]}。- TypeScript会根据每个对象中的
name字段,自动推断出values应匹配的类型,精准检测类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Jodi Warren
相关产品推荐
相关产品推荐

