`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 N
在 Tuple
类型中的作用。
_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"]
我无法理解我在创建元组类型的库中看到的代码。
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 N
在 Tuple
类型中的作用。
_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"]