TS—type和interface的使用

213 阅读3分钟

typeinterface是定义接口的两种不同形式,都能用来定义 对象 或者 函数 的形状。

使用情况分别如下:

type

作用:type学名为类型别名,即给其他类型取别名。关键字type可以用来声明接口,type描述基本类型,如string、number、boolean、null、undefined、bigint、symbol。

type的使用

//接口定义对象
type k = {
    a1: number,
    a2: string,
    a3?: boolean,  //可选属性:即a3属性可有可无。如果有,则为boolean类型
    readonly a4?: number,    //readonly只读属性,只能在创建的时候被赋值
}

const k1: k = {
    a1: 1,
    a2: "222",
    a4: 333     //初始化时被赋值,不会报错
}

//k1.a4=3333   //若初始化时已赋值,又再此赋值给a4,将会报错

//接口定义函数
type Add = (x:number,y:number) => number;

<!--带有属性的函数的声明方式-->
type Add = {                      //1.类型声明用type
       (x:number,y:number) : number
       prop : string 
};

const Add1: Add = (a,b) => {     //Add1的编译将无法通过
       return a*b
}
Add1.prop = 'hello'              //2.声明后给它赋个值,如果不加此句话

console.log(Add1)

interface

作用:使用关键字interface声明接口,描述对象的属性,用来定义对象的类型函数的类型

interface的使用

//接口定义对象
interface k {                  //定义了一个接口 k
    a1: number,
    a2: string,
    a3?: boolean,
    readonly a4?: number,
}

const k1: k = {               //接着定义了一个变量 k1,它的类型是 k
    a1: 1,
    a2: "222",
    a4: 333
}

//接口定义函数
<!--带有属性的函数的声明方式-->
interface AddFuc { 
        (x: number, y: number): number;
        prop : string
        
}
const AddFuc1: AddFuc = (a,b) => {     //Add1的编译将无法通过
       return a*b
}
AddFuc1.prop = 'hello'  //2.声明后给它赋个值,如果不加此句话

console.log(Add1)

注意:赋值的时候,变量的形状必须和接口的形状保持一致

type和interface的区别

1.interface只描述对象,type则描述所有数据。

2、type只是别名,interface则是类型声明。

type A = string    //A不真实存在
const B = A        //BAB为string类型
interface D extends Date { }   //D真实存在的类型
type E = D    //E也为D的类型

3、type不可重新赋值。

type A = string   //A初始化为number,其将一直是number类型(类似const)
A = number   //报错

4、type 可以用于创建类型别名,即给一个类型起个新名字,而interface不行。

type myString = string;

const a : myString = 'Hi'

console.log(a)

5.type可以用于声明联合类型,而interface不行。

type luckynumber = number | string ;

6.interface可以用于接口的合并(自动合并),而type不行。原因是:interface只描述对象,type则描述所有数据。在对象里加个属性,interface不会改变原有的逻辑,是可以扩展的;而type有可能是基本类型,如string类型,其是个整体的值,没有增加属性的可能性,故无法扩展。当type用于合并接口时,会报 重复定义 的警告,因此type无法实现接口的合并。

interface  person {
        name:string
        age:number
 } 
 
interface  person {
       sex:string
} 

//合并后
interface  person {
       name:string
       age:number
       sex:string
} 

注意,合并的属性,其类型必须是唯一的。可重复声明属性,但类型必须一致,不然会报错。如下情形所示:

interface  person {
        name:string
        age:number
 } 
 
interface  person {
       name:string    //重复但类型一致,不会报错
       sex:string
} 
interface  person {
       name:string
       age:number
 } 
 
interface  person {
       name:number    //重复但类型不一致,会报错
       sex:string
}