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 类型的函数
};