【问题标题】:Typescript difference between T and "T extends unknown"T 和“T 扩展未知”之间的打字稿差异
【发布时间】:2022-07-05 09:19:57
【问题描述】:

在typescipt中,TT extends unknown作为类型参数有什么区别。例如:

function check<T extends unknown>(x: T): T {
    return x;
}

function check<T>(x: T): T {
    return x;
}

他们在行为方面有什么不同吗?

【问题讨论】:

  • 没有区别,T extends unknown解析为T

标签: typescript typescript-generics


【解决方案1】:

我相信这些或多或少是等价的:

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#new-unknown-top-type

unknown 是 any 的类型安全对应物。任何东西都可以分配给unknown,但unknown 不能分配给任何东西,除了它自己和any,没有类型断言或基于控制流的缩小。同样,在没有首先断言或缩小到更具体的类型之前,不允许对 unknown 进行任何操作。

【讨论】:

  • 是的。我早些时候在这个链接上,是的,他们也觉得我和我一样。但是我看到在我需要使用的代码库中广泛使用了“T extends unknown”。不幸的是,作者无法访问。所以我想我会在这里问绝对确定。
【解决方案2】:

正如其他人所指出的,T extends unknown 似乎等同于 T在您提供的上下文中。但是,还有另一个上下文,即conditional types,其中T extends unknown 可以用作防范neverHere's 一个真实的例子,我将在这里重现:

type UnionKeys<T> = T extends unknown ? keyof T : never;

type InvalidKeys<K extends string | number | symbol> = { [P in K]?: never };
type StrictUnionHelper<T, TAll> = T extends unknown
  ? T & InvalidKeys<Exclude<UnionKeys<TAll>, keyof T>>
  : never;

export type StrictUnion<T> = StrictUnionHelper<T, T>;

严重的是,这正如预期的那样无效:

const x: UnionKeys<never> = "a";

但这不是错误:

type UnguardedUnionKeysDontUse<T> = keyof T;
const y: UnguardedUnionKeysDontUse<never> = "a";

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多