Typescript三元运算符中断标识类型

ifsvaxew  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(149)

为什么下面的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>'
}

Playground示例

rqqzpn5f

rqqzpn5f1#

这是因为分布式条件类型。SupposedId分布到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;
}

相关问题