Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本嵌套索引类型_Typescript - Fatal编程技术网

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;
}
*/