在typescript中interface和type的区别和相同点

 

相同点

1.都可以描述一个对象或者函数

interface

interface People {
    name: string
    age: number
}
interface setPeople {
    (name:string,age:number):void
}
type

type People = {
    name: string
    age: number
};
type setPeople = (name:string,age:12)=>void;

2.都允许相互拓展属性,但是语法不同

interface extends interface 关键词:extends

interface Name {
    name:string;
}
interface People extends Name {
    age:number;
}

interface extends type 关键词:extends

type Name = {
    name:string;
}
type People = Name & {age:number}

type extends type 关键词:&

type Name = {
    name:string;
}
type People = Name & {age:number}

type extends interface 关键词:&

interface Name = {
    name:string;
}
type People = Name & {age:number}
  • 总结只要是interface扩展属性无论是interface还是type都使用关键字extends;type的扩展属性无论是type还是interface都是使用关键字&

不同点

interface支持的声明格式,type不支持

·interface可以多次定义相同的名称,并且会自动合并所声明的所有成员,type不支持

 interface Person {
     name:String
 }
 interface Person {
     age: Number
 }
 const person: Person = {name:'zs',age:12}

type支持的声明格式,interface不支持

· 类型别名可以用于其它类型 (联合类型、元组类型、基本类型(原始值)),interface不支持

type PersonName = {name:string}
type PersonAge = {age:number}
​
// union(联合)
type person = PersonName|PersonAge;
​
//tuple(元祖)
type Data = [PersonName,PersonAge]
​
//primitive(原始值)
type age = number;
​
// tyoeof的返回值
let age = 12
type name = typeof age;

·type支持能使用in关键字生成映射类型,interface不支持

type Keys = 'firstname' | 'surname';
​
type DudeType = {
    [key in Keys] :string; //映射每个参数
};
​
const test: DudeType = {
    firstname: 'zhang',
    surname: 'san'
}

既然提到了映射类型,来了解一下映射类型在ts中的妙用:

TypeScript提供了从旧类型中创建新类型的一种方式 — 映射类型。 在映射类型里,新类型以相同的形式去 转换旧类型里每个属性。

interface People {
    name: string
    age: number
    height:number
    address:string
}
​
//自定义映射规则
type Nullable<T> = {[P in keyof T]: T[P] | null}//调用此映射后可以设置属性值为null
​
 
const person: Nullable<People> = {name:'zs',age:12, height:null,address:null}
​
const person1: Readonly<People> = {name:'zs',age:12, height:12,address:'utuy'}
​
const person2: Partial<People> = {name:'zs', height:12,address:'utuy'}
//Readonly是ts内部自带只读的映射,实现原理如下
// type Readonly<T> = {
//     readonly [P in keyof T]: T[P];
// }
//
//Partial是ts内部自带的可选的映射,实现原理如下
// type Partial<T> = {
//     [P in keyof T]?: T[P];
// }
//
// person1.name='dsad'//这时候不能更改此属性

 

默认导出方式不同

// inerface 支持同时声明,默认导出 而type必须先声明后导出
export default interface Config {
  name: string;
}
// 同一个js模块只能存在一个默认导出哦
 type Config2 = {name: string}
  export default Config2

总结: 一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。其他更多详情参看 官方规范文档

 

不停学习,热爱是源源不断的动力。
原文地址:https://www.cnblogs.com/ximenchuifa/p/14896970.html