为什么typescript的关键字extends有不同的含义以及如何理解它?

toe95027  于 2023-04-13  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

例如:

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左是文字常量,它是xy,当然它不能从右边继承--文字常量x,所以它是数字类型。例子A2是同样的原因,所以类型是string。但是例子A3,为什么test1可以扩展test?我试着用Java的继承来理解,test1可以强制转换为test,但是如何这样解释例子A1呢?
有没有人能帮我解决这个问题?这个问题困扰我很久了,谢谢!

oyjwcjzk

oyjwcjzk1#

我认为最好的解释方法是使用术语is assignable to

type A1 = 'x' | 'y' extends 'x' ? string : number;

'x' | 'y'不能赋值给'x',因此结果类型是number

type A2 = string | number extends string | number | boolean ? string : number;

string | number可以赋值给string | number | boolean(所有左侧类型都可以赋值给右侧),因此结果类型是string

interface test {
  name: string;
}

interface test1{
  name: string;
  age: number;
}

type A3 = test1 extends test ? string : number;

test可以赋值给test1(同样,左手的所有属性都可以赋值给右边),因此结果类型将是string
为了澄清,如果你想打破最后一个例子,你可以简单地添加一个属性到test中,而这个属性在test1中不存在:

interface test {
  name: string;
  city: string; // add this
}

interface test1{
  name: string;
  age: number;
}

type A3 = test1 extends test ? string : number // number

相关问题