挑战

对于给定的元组,你需要创建一个泛型Length类型,取得元组的长度。

例如:

type tesla = ["tesla", "model 3", "model X", "model Y"];
type spaceX = [
  "FALCON 9",
  "FALCON HEAVY",
  "DRAGON",
  "STARSHIP",
  "HUMAN SPACEFLIGHT"
];

type teslaLength = Length<tesla>; // expected 4
type spaceXLength = Length<spaceX>; // expected 5

解答

我们知道在 JavaScript 中可以使用属性length来访问数组的长度。我们也可以在类型上 做同样的事情:

type Length<T extends any> = T["length"];

但是按照这种方式,我们将得到编译错误“Type ‘length’ cannot be used to index type ‘T’.”。所以我们需要给 TypeScript 一个提示,告知我们的输入类型参数有这个属性:

type Length<T extends { length: number }> = T["length"];

另一种解决方案:

type Length<T extends readonly any[]> = T["length"];

参考