- type 和 interface 区别
- interface 无法声明联合类型,type可以声明联合类型
interface主要用于定义对象的形状(shape),它只能描述对象、函数或类的结构。type则更加灵活,它可以声明任意类型的别名,包括联合类型、交叉类型、元组等。
type PersonType = string | number;
- type 不能重名
type PersonType = string | number;
type PersonType = string | Boolean; // 重复的标识符
interface A{
name:string
}
interface A{
isMan:boolean
}
let a:A = {name:'zhangsan',isMan:true}
- inerface特性
- 子可以赋予给父亲,我们需要把一个值赋予给另一个值
interface IPerson{
name:string
age:number
}
// 声明的必须一致
let person:IPerson={
name:"张三",
age:20,
isMale:true // ts 报错类型“IPerson”中不存在“isMale”
}
// 赋值会产生兼容性问题(儿子可以赋予给父亲)
interface IPerson {
name: string
age: number
}
let obj = {
name: "张三",
age: 20,
isMale: true
}
let person: IPerson = obj
- 接口描述函数
interface Ifun {
(): number
count: number
}
// 如果给函数增加类型定义,函数不能被修改时只能用 const
const fun: Ifun = function () { // 不能用 let 不安全
return fun.count++
}
fun.count = 1
- ? 的方式表示可有可无
interface TVeg{
name:string;
price:number;
quantity?:number;
}
const vag:TVeg={
name:"Veg",
price:100,
}
或者
interface TVeg{
name:string;
price:number;
quantity:number;
}
const vag:TVeg={
name:"Veg",
price:100,
} as TVeg;
虽然 quantity 没有被赋值,但通过 as TVeg,你明确告诉编译器你保证这个对象是符合 TVeg 接口的。因此 TypeScript 不再进行严格的属性检查。
- 扩展新类型
interface IPerson {
name: string;
age: number;
}
interface IStudent extends IPerson {
id: number;
}
const student: IStudent = {
name: '张三',
age: 18,
id: 1
}
- 任意类型
interface IPerson {
age: number;
[key: string]:any
}
let person: IPerson = {
age: 18,
name: 'xiaoming',
address: 'beijing'
}
- 通过索引访问符,来获取内部类型
interface IPerson {
age: number;
name: string;
sex: string;
}
type IAge = IPerson['age']; // number
interface IPerson {
age: number;
name: string;
sex: string;
}
type IKeys = keyof IPerson;
let key: IKeys = 'name'; // 'age' | 'name' | 'sex'
// 取值的类型
interface IPerson {
age: number;
name: string;
sex: string;
}
type IKeys = keyof IPerson;
let key: IKeys = 'name'; // 'age' | 'name' | 'sex'
type IValues = IPerson[IKeys]; // string | number