什么事interface
用于描述对象的结构和属性。本身就是个类型
interface可以被实现(implements)或扩展(extends)。和类有关系。
什么是type
表示类型的别名。
它允许我们为任何类型创建别名。包括上面的interface也可以用类型创建别名。
type可以表示对象,联合类型,交叉类型等,并且可以进行复杂的类型操作。
interface User{
name:string
age:number
}
type UserType={
name:string
age:number
}
type UserType1=User;
function fun(params:User):User{
params.age
return params;
}
这个函数这样写冒号后面的代表返回值,也可以用UserType.
上面那个是接口对象,下面的UserType是对象别名,右边的是对象
有什么区别?
1,一个是结构,一个是别名
inerface可以扩展,type不能扩展。
interface Person extends User{
email:string
} Person接口对象继承User的属性外,额外添加email的属性。
2,interface重名会合并,type不能重名。
interface User{
gender:string
name:number
}
前面已经定义了name是string ,这里改成number会报错。
3,interface可以被类实现,type不能。inteface就是接口对象,就是拿来被类实现的。用class的关键字就可以定义一个类
class Man implements User{
}
定义一个类叫Man,这个Man会报错,让你必须要去实现user里面定义好的属性,不能不实现它。用一个接口对一个类要实现的东西进行约束
class Man implements User{
name:string;
age:number;
gender:string;
constructor(name:string,age:number,gender:string){
this.name=name;
this.age=age;
this.gender=gender;
}
}
这样还是会报错,会提示你必须要写个构造器进行初始化。用一个叫Man的类实现了User的属性。如果接口里面加了个函数,这个类里面也必须要有这个函数
4,type支持联合类型和交叉类型,interface不支持
type可以定义一个两个类型运算之后的别名,
type People=Man | Woman
|或的运算,只要符合一个就可以
interface Woman{
age:number
}
interface Man{
name:string
}
type People = Man | Woman
const p:People={
//age:12,
name:'jack'
}
Man | Woman就是联合类型的,交叉类型用&符表示
type UserMan=Man & Woman
const u:UserMan = {
name:'jack',
age:12
}
必须两个属性都有
type可以进行简单的联合类型和交叉类型的运算
在日常工作中,定义描述结构的时候大多数用的是interface ,只有在要对类型做一个运算的时候才会用type.不知道用type还是用interface的时候,两个都可以的时候,就用interface。
规范
1,定义类型首字母都要大写,有的公司会要求在interface前面加个大写的I,在type前面加个大写的T,不推荐加这个,java里面经常用到。前端很少用到class。
interface 描述对象的结构及属性
可以被实现class implements或者extends
interface User {
name: string;
age: number
}
// 类型别名
type UserType = User
// 继承类型
interface Person extends User {
sex: string
}
联合和交叉类型
区别
别名
//接口--类型的结构 interface User { name:string age: number } //类型别名 type UserType = { name:string age: number } function fun(params:User):User{ return params } // 接口可扩展,类型不能 interface Person extends User{ email:string } //接口可以被类实现,type不能 class ManC implements User{ name:string; age: number; email: string; constructor(name:string, age:number,email:string){ this.name = name; this.age = age; this.email = email } } interface Woman{ age: number } interface Man{ name:string } //type支持联合类型和交叉类型,interface不支持 type People = Man | Woman; //联合类型 Man & Woman 交叉类型(两个都得有) const p:People = { name: 'zyw', age: 34 } //两种都可以用时,首选interface //首字母大写 //有些公司,interface前加I,type前加T。不建议
1
interface User{ name:string age:number } type UserType = { name:string age:number } type UserType1 = User; class Person extends User{ email:string }
1