type OriginalParams = [a: number, b?: string | undefined, c?: { cc: 1;} | undefined];
type NewParams = OriginalParams extends [infer A, infer B, ...any] ? [A, B?]: never;
我想从 OriginalParams 中获取前两个元素,但 NewParams 将是
never
。
如果我让 b 成为实际需要的,例如:
type OriginalParams = [a: number, b: string | undefined, c?: {
cc: 1;} | undefined]
可以像
[number, (string | undefined)]
一样正确。
我想知道为什么?会干扰推断。
问题在于您有可选的元组成员,并且 TS 不知道元组的实际形状,因此无法推断。您可以创建一些复杂的条件类型来处理此问题,但在您的情况下,也许使用索引访问会更容易:
type OriginalParams = [a: number, b?: string, c?: { cc: 1;}];
type NewParams = [OriginalParams[0], OriginalParams[1]?];
嗯,我不确定我的答案是不是最好的方法...
但是改编自Docs中的示例:
type Flatten<Type> = Type extends Array<infer Item> ? Item : Type;
也许这就是您需要做的?
type NewParams = OriginalParams extends [infer A, (infer B)?, ...(infer Rest)] ? [A, B?, ...Rest] : never;
在这里,我扩展了它以包含
rest
并从 undefined
中删除了 OriginalParams
(因为它们是可选的 (?
),因此已经暗示了)
type OriginalParams = [a: number, b?: string, c?: { cc: 1;}];
type NewParams = OriginalParams extends [infer A, (infer B)?, ...(infer Rest)] ? [A, B?, ...Rest] : never;
// These are valid
const newParams1: NewParams = [1];
const newParams2: NewParams = [1, ""];
const newParams3: NewParams = [1, "", {cc: 1}];
// These show errors
const newParamsError1: NewParams = [""];
const newParamsError2: NewParams = [1, 2];
const newParamsError3: NewParams = [1, "", {cc: 2}];
const newParamsError4: NewParams = [1, "", {cc: 1}, 2];