大多数情况下,两者等价,有些情况有些区别
1.对象和函数二者都可以定义,基础类型数据不能用interface定义
2.扩展方式不同,interface通过extends实现,type通过&实现,并且可以相互拓展
// interface 扩展为 Type
type E={a: string }interfaceFextendsE{b: number }constobj2:F={a:`杜杜`,b:7}// type 扩展为 interfaceinterfaceG{a: string }
type H=G&{b: number}constobj3:H={a:`杜杜`,b:7}3.interface可以被重复定义,并且会进行合并,但是type不行
classclacArray<T>{privatearr:T[]=[];add(value:T){this.arr.push(value)}getValue():T{let res =this.arr[0]
console.log(this.arr)return res
}}const res =newclacArray()
res.add(1)
res.add(2)
res.getValue()//[1,2,3]
console.log(res.getValue)// 1
泛型类型别名
type info<T>={
name?:T
age?:T}constres:info<string>={name:'dudu'}constres1:info<number>={age:7}
泛型默认参数
const calcArray =<T= string,>(data:T):T[]=>{letlist:T[]=[]for(let i =0; i <3; i++){
list.push(data)}return list
}
interfaceProps{name: string
age: number
}letinfo: Readonly<Props>={name:'dudu',age:7}
info.age =1//error read-only 只读属性
Record
Record<Kextendskeyof any,T>//将K中所有属性转化为T类型interfaceProps{name:string;age:number
}
type InfoProps='JS'|'TS'constInfo:Record<InfoProps,Props>={JS:{name:'du',age:1},TS:{name:'ts',age:11}}
Pick
Pick<T,KextendskeyofT>//将某个类型中的子属性挑出来,变成包含这个类型部分属性的子类型interfaceProps{name:string
age:number
sex:boolean
}
type nameProps=Pick<Props,'name'|'age'>constinfo:nameProps={
name:'dudu',age:2}
Exclude
Exclude<T,U>//将T类型中的U类型剔除
当 T 中有 U 就会剔除对应的属性,如果 U 中又的属性 T 中没有,或 T 和 U 刚好一样的情况都会返回 nerver,且对象永远返回nerver
Extra
Extra<T,U>//从T中提取U
Omit
Omit<T,U>//将已经声明的类型进行属性剔除获取新的类型
type InfoProps={name:string
age:number
sex:boolean
}
type Props=Omit<InfoProps,'sex'>//区别,Omit返回一个新类型,Exclude修改原类型
NonNullable
NonNullable<T>//从T中排除null和undefined
type Props=NonNullable<string|number|null|undefined>
ReturnType
ReturnType<T>//获取函数T的返回类型
type Props = ReturnType<()=> string>// string
type Props1 = ReturnType<TextendsU,Uextendsnumber>()=>T>;// number
type Props2 = ReturnType<any>;// any
type Props3 = ReturnType<never>;// any
Parameters
Parameters<T>//用于获取函数类型的参数类型
type Props = Parameters<()=> string>// []
type Props1 = Parameters<(data: string)=>void>// [string]
type Props2 = Parameters<any>;// unknown[]
type Props3 = Parameters<never>;// never