`N extends N` 在这种类型中做了什么?

What does `N extends N` do in this type?

我无法理解我在创建元组类型的库中看到的代码。

type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N
  ? R
  : _TupleOf<T, N, [T, ...R]>;

export type Tuple<T, N extends number> = N extends N
  ? number extends N
    ? T[]
    : _TupleOf<T, N, []>
  : never;

并被使用

Tuple<string, 10>

我是打字稿的新手。不过我是这么理解的。

Tuple中输入

我不明白 N extends N 在这里做了什么,因为它永远是真的。

number extends N 根据它检查它是文字类型还是数字类型,它将 return 数组或元组。

例如:

Tuple<string,number> //string[]
Tuple<string,2> // [string,string]

并在 _TupleOf

R['length'] extends N 检查大小是否与 N 相同。

我无法理解 N extends NTuple 类型中的作用。

_TupleOf 类型接受项目的联合 T。它还为草案元组的当前累加器接收草案数组。基本上,它检查元组累加器的当前长度是否等于所需元组大小的给定数字。如果是这样,return 累加器,否则递归并使用提供的 T 联合将新项目添加到草案元组类型。累加器元组的给定 R 的长度随后将递增 1 以说明下一项。因此,整个类型只是在推送到草稿数组时执行一个简单的循环,同时检查新数组的长度是否等于目标长度。下面是一个 TypeScript 代码示例,如果它更容易理解的话:

function tupleOf<T>(item: T, n: number, draft: T[] = []): T[] {
  if (draft.length === n) { // the exit clause
    return draft;
  }
  draft.push(item); // the pushing part
  return tupleOf(item, n, draft);
}

const foo = tupleOf("Hey", 5);
console.log(foo); // ["Hey", "Hey", "Hey", "Hey", "Hey"]

TypeScript Playground Link