为什么带修饰符`?`的ts无法推断?

问题描述 投票:0回答:2
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)]
一样正确。

我想知道为什么会干扰推断

typescript
2个回答
1
投票

问题在于您有可选的元组成员,并且 TS 不知道元组的实际形状,因此无法推断。您可以创建一些复杂的条件类型来处理此问题,但在您的情况下,也许使用索引访问会更容易:

游乐场

type OriginalParams = [a: number, b?: string, c?: { cc: 1;}];  

type NewParams = [OriginalParams[0], OriginalParams[1]?];

0
投票

嗯,我不确定我的答案是不是最好的方法...

但是改编自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];

游乐场

© www.soinside.com 2019 - 2024. All rights reserved.