【问题标题】:Typescript `custom type` only works in type world, but not actually working with `function`Typescript `custom type` 仅适用于类型世界,但实际上不适用于 `function`
【发布时间】:2023-03-31 22:34:01
【问题描述】:

我有一个名为Tail 的自定义类型,它将返回没有第一个元素的数组类型:

type Tail<T extends any[]> =
    ((...t: T) => any) extends ((_: any, ...tail: infer TT) => any)
    ? TT
    : []

type test11 = Tail<[1, 2, string, number]> // [2, string, number]

上面的代码运行正常,但是使用with函数时,现在不行了:

function tail<T extends any[]>(arr: T): Tail<T> {
  return arr.slice(1) as Tail<T>;
}

let result = tail(['', 1]); // res: (string | number)[]

result 应该只有number,但是却显示(string | number)[],为什么?

【问题讨论】:

    标签: arrays typescript tuples type-inference tail


    【解决方案1】:

    请参阅Typescript specification。具体来说,它说:

    [给定]规则意味着数组字面量始终是数组类型,除非它是由类似元组的类型在上下文中键入的。

    在您对tail 的调用中,['', 1] 类型的唯一提示是any[]。 (见第 4.15.2 节。我略读了它,似乎是这样说的,但如果我错了,有人可以叫我出来。)因此,它的类型变成了(string | number)[],你用签名调用tail

    tail<(string | number)[]>(arr: (string | number)[]): (string | number)[]
    

    您可以将问题重现为

    let i = ['5', 5]
    let x: [number] = tail(i)
    

    你会看到它消失在

    let i: [string, number] = ['5', 5]
    let x = tail(i) // x: [number] (inferred)
    

    我相信您根本无法在这种情况下推断出元组类型。但是,应该没问题,因为您不应该经常将文字传递给 tail

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多