5. 接口

88 阅读2分钟
  • type 和 interface 区别
  1. interface 无法声明联合类型,type可以声明联合类型
  • interface 主要用于定义对象的形状(shape),它只能描述对象、函数或类的结构。
  • type 则更加灵活,它可以声明任意类型的别名,包括联合类型、交叉类型、元组等。
 type PersonType = string | number;
  1. 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特性
  1. 子可以赋予给父亲,我们需要把一个值赋予给另一个值
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
  1. 接口描述函数
interface Ifun {
    (): number
    count: number
}
// 如果给函数增加类型定义,函数不能被修改时只能用 const
const fun: Ifun = function () { // 不能用 let 不安全
    return fun.count++
}
fun.count = 1
  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 不再进行严格的属性检查。

  1. 扩展新类型
interface IPerson {
	name: string;
	age: number;
}
interface IStudent extends IPerson {
	id: number;
}
const student: IStudent = {
	name: '张三',
	age: 18,
	id: 1
}
  1. 任意类型
interface IPerson {
	age: number;
    [key: string]:any
}

let person: IPerson = {
	age: 18,
    name: 'xiaoming',
    address: 'beijing'
}
  1. 通过索引访问符,来获取内部类型
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