我有一个接口,想确定是否有任何值是可选的。为了做到这一点,我想我应该用所有的值创建一个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
1条答案
按热度按时间k97glaaz1#
我们对extends工作方式的理解导致了这里的问题。
Conditional types的形式看起来有点像条件表达式(condition?trueExpression:falseExpression)在JavaScript中:
当extends左边的类型可以赋值给右边的类型时,你将在第一个分支(“true”分支)中得到该类型;否则你将在后一个分支(“false”分支)中得到类型。
看看下面的代码:
Y在上面是真的。
在问题中,
[SomeInterface[keyof SomeInterface]]
不能赋值给[undefined]
。实际上,[undefined]
可以赋值给[SomeInterface[keyof SomeInterface]]
。所以你有反过来的条件。你可以改变你的代码如下:
应该能成功
Playground链接