type和interface是定义接口的两种不同形式,都能用来定义 对象 或者 函数 的形状。
使用情况分别如下:
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 //B≠A,B为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
}