typescript中直接定义的子类型不能赋值给父类型,间接的则可以,ts为何这样设计?

直接给父类型的test赋值子类型的值则报错,但间接通过子类型的变量a给父类型的test赋值则不报错,为什么?另外ts为什么要这样设计?

interface tp1 {
  name: string;
}
interface tp2 extends tp1 { 
  age: number 
}
let a = {
   name: "dahuang",
   age: 20,
}
// 报错类型不符合
let test: tp1 = {
  name: "dahuang",
  age: 20,
};
// 不报错
let test2:tp1 = a;
阅读 1.5k
2 个回答

在 TypeScript 中,直接定义的子类型(即字面量类型或者接口定义的类型)不能赋值给父类型,是因为这样的子类型并没有被赋予一个名称,而是直接被使用在代码中。这就意味着,如果直接将一个字面量类型或接口定义的类型赋值给一个父类型的变量或参数,就会发生类型不匹配的错误。

你可能认为

{
   name: "dahuang",
   age: 20,
}

就是 tp2 类型,所以才有“子类型不能赋值给父类型”疑惑。但其实它是一个"匿名类型",匿名类型就走匹配的规则了。

可以标注一下类型

let a = {
   name: "dahuang",
   age: 20,
} as tp2;
logo
Microsoft
子站问答
访问
宣传栏