typescript 为什么这个基于非分配联合类型的条件不起作用?

yks3o0rb  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(123)

我有一个接口,想确定是否有任何值是可选的。为了做到这一点,我想我应该用所有的值创建一个union,然后检查它是否扩展了undefined。当它不起作用时,我读到了分配条件,并认为这肯定是解决方案。
代码如下:

export interface SomeInterface {
  someBool: boolean
  someOptionalNum?: number
  someOptionalText?: string
}

const test: [SomeInterface[keyof SomeInterface]] extends [undefined] ? boolean : string = true

根据typescript指南的这一部分,我希望这段代码可以工作,但是我不能让test成为boolean,它仍然停留在string上。
参见Typescript Playground

k97glaaz

k97glaaz1#

我们对extends工作方式的理解导致了这里的问题。
Conditional types的形式看起来有点像条件表达式(condition?trueExpression:falseExpression)在JavaScript中:

SomeType extends OtherType ? TrueType : FalseType;

当extends左边的类型可以赋值给右边的类型时,你将在第一个分支(“true”分支)中得到该类型;否则你将在后一个分支(“false”分支)中得到类型。
看看下面的代码:

type X = "A" | "B";
type A = "A";
type Y = A extends X ? true : false;

Y在上面是真的。
在问题中,[SomeInterface[keyof SomeInterface]]不能赋值给[undefined]。实际上,[undefined]可以赋值给[SomeInterface[keyof SomeInterface]]
所以你有反过来的条件。你可以改变你的代码如下:

export interface SomeInterface {
  someBool: boolean
  someOptionalNum?: number
  someOptionalText?: string
}

const test: [undefined] extends [SomeInterface[keyof SomeInterface]]  ? boolean : string = true

应该能成功
Playground链接

相关问题