采用第一个元素类型的泛型数组



遇到了这个挑战

实现一个泛型First,它接受数组T并返回其第一个元素的类型。

type arr1 = ["a", "b", "c"];
type arr2 = [3, 2, 1];
type head1 = First<arr1>; // expected to be 'a'
type head2 = First<arr2>; // expected to be 3

但我很困惑。既然任务说我们应该返回第一个元素类型,那么第一种情况下的返回不应该是string吗?而在第二个CCD_ 2中?

我错过了什么?

Ps。这是给定的解决方案,并且它确实返回"0";a";而不是字符串

type First<T extends any[]> = T extends [] ? never : T[0];

更新

在下面的代码中,head1被推断为string

let arr1 = ["a", "b", "c"]; // use let instead of type
type head1 = First<typeof arr1>; 

为什么当我在我的问题中使用type array1时,head1被推断为";a";以及以上作为";字符串";?

关键是arr1arr2不是数组类型;它们是元组类型。在JavaScript中,元组只是数组,但在TypeScript的类型系统中,元组的每个元素都有自己的类型。

如果使用";实际的";类型而不是文字,例如:

type arr1 = [string, number, Object];
const arr1Value: arr1 = ["hello", 42, {}];
type head1 = First<arr1>; // string

请注意,arr1不是一个数组。它是数组(或元组(的类型arr1Value是该类型的数组。

如果您没有提供数组文字的类型,则推断为:

let arr1 = ["a", "b", "c"]; // arr1 is of type string[]

现在,推断出的arr1的类型可以推断为['a', 'b', 'c'];也就是说,这三个字符串的元组。但这几乎不是你想要的:例如,它不允许你向数组中推送更多的值。因此TypeScript推断它是string[]。(如果您确实想推断元组类型,请在末尾添加as const。(

TypeScript中的类型不一定必须是string。它是一个有效的类型,但非常通用。

您可以使用将可能的字符串限制为仅'a''b''c'

type Abc = 'a' | 'b' | 'c';

如果您现在创建了一个声明了这种类型的变量,那么每当定义了不正确的值时,就会出现编译错误:

const name: Abc = 'John'; // TypeScript will mark this as incorrect

现在,为您提供解决方案,显然这就足够了:

type First<T extends any[]> = T[0];

最新更新