03. Typescript 接口和对象类型

165 阅读2分钟

1. 对象的类型

在 TS 中,定义对象的方式要用关键字 interface(接口) ,使用 interface 来定义一种约束,让数据的结构满足约束的格式

定义 interface 时首字母大写

1.1. 定义 interface

使用 interface 时,对象的属性必须和接口保持一致,不能缺少属性。

interface Person {
  name: string;
  age: number;
}

let person: Person = { name: 'John', age: 30 }; // 正确,符合 Person 接口的结构
let person2: Person = { name: 'John', age: 30, gender: 'male' }; // 错误,gender 属性不在 Person 接口中
let person3: Person = { name: 'John' }; // 错误,age 属性缺失

1.2. 重名合并

重名 interface 可以合并

interface A {
  name: string;
}
interface A {
  age: number;
}
var x: A = { name: "xx", age: 20 };

1.3. 继承

可以使用 extends 关键字进行集成

//继承
interface A {
  name: string;
}

interface B extends A {
  age: number;
}

let obj: B = {
  age: 18,
  name: "string",
};

1.4. 可选属性

可选属性的含义是该属性可以不存在  但是如果存在的话 必须是指定的类型  可选属性必须在最后面

interface Person {
  a:string
  b?:string,
}

const person:Person  = {
  a:"213"
}

1.5. 任意属性(索引签名)

可以使用 [propName: string]: any 来代表任意属性。

需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集

//在这个例子当中我们看到接口中并没有定义C但是并没有报错
//应为我们定义了[propName: string]: any;
//允许添加新的任意属性
interface Person {
  b?:string,
  a:string,
  [propName: string]: any;
}

const person:Person  = {
  a:"213",
  c:"123"
}

1.6. 只读属性

readonly 只读属性是不允许被赋值的只能读取

//这样写是会报错的
//应为a是只读的不允许重新赋值
interface Person {
  b?: string;
  readonly a: string;
  [propName: string]: any;
}

const person: Person = {
  a: "213",
  c: "123",
};

person.a = 123;

1.7. 添加函数

interface 支持添加函数

interface Person {
  b?: string,
  readonly a: string,
  [propName: string]: any;
  cb:()=>void
}

const person: Person = {
  a: "213",
  c: "123",
  cb:()=>{
      console.log(123)
  }
}

1.8. 定义函数类型

// 定义函数类型
interface SearchFunc {
  (source: string, subString: string): boolean; // 定义了一个函数类型,接收两个字符串参数,返回一个布尔值
}
let mySearch: SearchFunc; // 定义了一个变量,类型为 SearchFunc,即符合函数类型的函数

mySearch = function (source: string, subString: string): boolean {
  return source.search(subString) !== -1; // 实现了 SearchFunc 类型的函数
};

2. 文件下载

📎03.对象和接口类型.ts