Typescript入门__9__类型兼容性

190 阅读1分钟

1、介绍

Typescript里的类型兼容是基于结构子类型的。
结构子类型是一种只使用其成员来描述类型的方式。

interface Person{   
   name:string,  
    age: number, 
 }  
interface Man{  
    name:string, 
     age:number 
 }  
 let p:Person;
  p = new Man(); // 这是被允许的

2、初识类型兼容

兼容规则:如果x要兼容y,那么y至少具有与x相同的属性。

interface Person{  
    name:string,
  } 
 interface Man{   
   name:string,    
  age:number  
}  
   let m:Man;
   let p = {name:"lisi",age:12}; 
   m = p;  // 这是被允许的,因为m具有的属性,y都具备

3、比较两个函数

即判断两个函数是否兼容

let a = (x:number) => 0; 
let b = (y:number,z:string) =>0 
a = b;// 成立的,因为a函数中的属性b函数中都有 
b = a;// 不成立,因为b函数中的属性a函数中不全有

4、枚举

枚举类型与数字类型兼容,并且数字类型和枚举类型兼容。
不同枚举之间是不兼容的。

enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };
let status = Status.Ready;
status = Color.Green;  // Error

5、类

类与对象字面量和接口差不多
但是有一点不同:类有静态部分和实例部分的类型。
比较两个类类型的对象时,只有实例的成员会被比较。
静态成员和构造函数不在比较范围内。

class Person {  
  name: string; 
   constructor(name: string, age: number) { 
}
}
class Man {   
 name: number; 
   constructor(name:string,age: number) {
 }
}
let p: Person;
let m: Man;
p = m;  // OK
m = p;  // OK

6、泛型

因为Typescript是结构类型系统,类型参数只影响使用其作为类型一部分的结果类型。

interface Person<T> {}
let p1: Person<number>;
let p2: Person<string>;
x = y;  // OK
// x和y是兼容的,因为他们的结构使用类型参数一致。