TypeScript 通过其值类型缩小可索引类型的键

Posted

技术标签:

【中文标题】TypeScript 通过其值类型缩小可索引类型的键【英文标题】:TypeScript narrow down the keys of indexable type by its value types 【发布时间】:2019-08-10 15:05:31 【问题描述】:

鉴于我们有一个通用的可索引类型,我怎样才能只检索其值的类型以便能够缩小到只有一些键?

// imagine check is a function and its second argument only allows the property `a` as it's string and raise an error if 'b' is passed
const test2 = check( a: 'string', b: 22 , 'b'); // error only 'a' is allowed
const test2 = check( a: 'str', b: 'str2' , 'b'); // ok returns 'str2'

【问题讨论】:

【参考方案1】:

当然,您可以通过使用conditional 和mapped 类型来仅提取对象类型T 的键,其值与值类型V 匹配:

type KeysMatching<T, V> =  [K in keyof T]: T[K] extends V ? K : never [keyof T];
declare function check<T>(obj: T, k: KeysMatching<T, string>): string;

const test1 = check( a: 'string', b: 22 , 'b'); // error 
const test2 = check( a: 'str', b: 'str2' , 'b'); // ok 

希望对您有所帮助。祝你好运!

【讨论】:

以上是关于TypeScript 通过其值类型缩小可索引类型的键的主要内容,如果未能解决你的问题,请参考以下文章

typescript - 通过使用变量索引对象接口来获取类型

为啥 TypeScript 有时只能通过字符串索引对象

Typescript - 具有通用类型函数的索引签名

TypeScript:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型

在“”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误

TypeScript - 如何将索引签名表示为泛型类型