例如:
type A1 = 'x'|'y' extends 'x' ? string : number // A1 is number
type A2 = string|number extends string|number|boolean ? string : number // A2 is string
interface test {
name:string
}
interface test1{
name:string
age:number
}
type A3 = test1 extends test ? string : number // A3 is string, why?
我不知道怎么理解这里的extends
的意思,它看起来有不同的意思。在例子A1中,extends
左是文字常量,它是x
或y
,当然它不能从右边继承--文字常量x
,所以它是数字类型。例子A2是同样的原因,所以类型是string
。但是例子A3,为什么test1
可以扩展test?我试着用Java的继承来理解,test1
可以强制转换为test
,但是如何这样解释例子A1
呢?
有没有人能帮我解决这个问题?这个问题困扰我很久了,谢谢!
1条答案
按热度按时间oyjwcjzk1#
我认为最好的解释方法是使用术语
is assignable to
:'x' | 'y'
不能赋值给'x'
,因此结果类型是number
。string | number
可以赋值给string | number | boolean
(所有左侧类型都可以赋值给右侧),因此结果类型是string
。test
可以赋值给test1
(同样,左手的所有属性都可以赋值给右边),因此结果类型将是string
。为了澄清,如果你想打破最后一个例子,你可以简单地添加一个属性到
test
中,而这个属性在test1
中不存在: