如何使TypeScript将二维元组数组的索引0推断为字面量联合类型?
让TypeScript推断元组数组索引0为联合类型数组的方法
要让result的类型变成("a" | "c")[],核心是保留元组第一个元素的字面量类型信息——原来的KV类型是[string, string],会把具体的字面量(比如"a"、"c")拓宽为string,导致TypeScript无法推断出联合类型。
可以通过泛型捕获输入数组的具体类型来实现,具体写法如下:
// 用泛型T捕获每个元组的具体类型 function sample<T extends [string, string]>(param: readonly T[]) { // 提取每个元组的第一个元素类型,组成联合类型数组 return param.map(([key]) => key) as (T[0])[]; } // 调用函数时,TypeScript会自动推断T为["a","b"] | ["c","d"] const result = sample([ ["a", "b"], ["c", "d"], ]); // result的类型为 ("a" | "c")[]
如果需要更灵活的类型约束(比如允许元组第二个元素是任意类型),可以调整泛型:
function sample<T extends [string, unknown]>(param: readonly T[]) { return param.map(([key]) => key) as (T[0])[]; }
另外,如果输入的数组是预先定义的变量,可以用as const断言强制保留字面量类型,再传入函数:
const kvs = [ ["a", "b"], ["c", "d"], ] as const; function sample<T extends readonly [string, string][]>(param: T) { return param.map(([key]) => key) as (T[number][0])[]; } const result = sample(kvs); // result类型为 ("a" | "c")[]
原理是:泛型T会捕获输入数组中每个元组的具体字面量类型,T[0](或T[number][0])会提取所有元组第一个元素的类型组成联合类型,最终返回值的类型就是这个联合类型的数组。
内容的提问来源于stack exchange,提问作者xliez
相关产品推荐
相关产品推荐

