Typescript 类型脚本嵌套索引类型
我正在尝试编写一个类型级函数Typescript 类型脚本嵌套索引类型,typescript,Typescript,我正在尝试编写一个类型级函数Foo,它将获取“二维”数组的第一个元素的类型。我写了以下内容 type Foo<A extends any[][]> = { [I in keyof A]: First<A[I]> } type First<A extends any[]> = A[0] 我很难理解。具体来说,A[string]| A[number]| A[symbol]来自何处。我的理解是,应该允许我对数组的元素进行索引,这些元素应该是更多的数组。我
Foo
,它将获取“二维”数组的第一个元素的类型。我写了以下内容
type Foo<A extends any[][]> = {
[I in keyof A]: First<A[I]>
}
type First<A extends any[]> = A[0]
我很难理解。具体来说,A[string]| A[number]| A[symbol]
来自何处。我的理解是,应该允许我对数组的元素进行索引,这些元素应该是更多的数组。我可以通过先定义这样的来解决这个问题
type First<A> =
A extends any[] ? A[0] :
never;
首先键入=
A扩展任何[]?A[0]:
从未;
但我不明白为什么这是必要的。我知道这很讨厌。它被标记为一个。根本的问题是,编译器仅在使用映射类型时才意识到它映射了数组/元组,而不是在定义它时
事实上,这甚至是可能的,这意味着编译器不能假定A[I]
可分配给any[]
,因此您当前必须执行类似提取的操作。感谢您提供票证链接和摘录
建议。
type First<A> =
A extends any[] ? A[0] :
never;
// here the compiler doesn't know that I will be a numeric-like key:
type Foo<A extends any[][]> = { [I in keyof A]: Extract<A[I], any[]>[0] };
// only here does the compiler perform the mapping with just the numeric-like keys:
type Expected = Foo<[[1, 2], [3, 4], [5, 6], [7, 8]]>;
// type Expected = [1, 3, 5, 7]
type Unexpected = Foo<[[1, 2], [3, 4], [5, 6], [7, 8]] & { a: string }>;
/* type Unexpected = {
[x: number]: 1 | 3 | 5 | 7;
0: 1;
1: 3;
2: 5;
3: 7;
length: never;
toString: never;
toLocaleString: never;
pop: never;
push: never;
concat: never;
join: never;
reverse: never;
shift: never;
slice: never;
sort: never;
... 18 more ...;
a: never;
}
*/