Typescript 三元运算符破坏身份类型

Ale*_*xHv 1 conditional-operator typescript

为什么我的SupposedId下面的类型不是类型标识?

Typescript 正在抱怨Type 'T' is not assignable to type 'SupposedId<T>'.

为什么T不能分配给 或TT我错过了什么?

type SupposedId<T> = T extends object ? T : T;

function makeId<T>(test: T): SupposedId<T> {
  return test // <- Type 'T' is not assignable to type 'SupposedId<T>'
}
Run Code Online (Sandbox Code Playgroud)

游乐场示例

Chr*_*ald 5

这是因为分布式条件类型。ShouldedId 分发到T extends any | T extends object. 您的情况当然是一个新颖的案例,因为它们实际上都解决了T,但条件类型根据是否 执行不同的缩小T extends object

但是,根据文档,您可以通过在 extends 关键字的每一侧添加方括号来修复它:

type SupposedId<T> = [T] extends [object] ? T : T;

function makeId<T>(test: T): SupposedId<T> {
  /* `test` is now one of `T extends object` or `T extends any`,
     not `T extends object | T extends any` */
  return test;
}
Run Code Online (Sandbox Code Playgroud)