一、TypeScript-接口
1. TypeScript-接口定义
在TypeScript中,通用性的规范,一般使用接口进行定义。
- 接口可以用来定义通用属性
interface Person {
name: string;
// ?表示可有可无的参数
age?: number;
// 如果是readonly修饰,表示这个变量只能被读取,不能进行赋值
readonly sex: string;
// 未来的未知属性,表示这个接口,可以多出其它一个或多个属性,只要满足key为string, 类型为任意类型
[propName: string]: any;
}
- ?表示该属性可有可无,当该接口被继承或者实现的时候,该属性可以不被强制实现。
- 未知属性定义,主要用于强校验的写法,比如直接传入字面量
const getPersonName = (person: Person): void => {
console.log(person.name);
};
const person = {
name: "dell",
sex: "男",
};
// 将person变量传给getPersonName,进行的是弱校验,即使多了或者少了属性也不会报错
getPersonName(person);
// 如果传入的是字面量形式则会进行强校验,报错,如果保证不报错就需要在接口中添加未知属性的定义
getPersonName({
name: "dell",
sex: "男",
job: "程序员",
});
- 接口可以用来定义方法
interface Person {
// 定义方法say,返回值是string
say(): string;
}
- 接口自身也可以定义函数
// 接口自身也可以定义函数
interface SayHi {
(word: string): string;
}
const say: SayHi = (word: string) => {
return "sayHi";
};
2. TypeScript-接口实现与继承
- 实现
// 接口定义
interface Person {
name: string;
// ?表示可有可无的参数
age?: number;
// 如果是readonly修饰,表示这个变量只能被读取,不能进行赋值
readonly sex: string;
// 未来的未知属性,表示这个接口,可以多出其他一个或多个属性,只要满足key为string, 类型为任意类型
[propName: string]: any;
// 定义方法say,返回值是string
say(): string;
}
// 接口实现
class UserInfo implements Person {
name = "dell";
sex = "女";
say() {
return "hello";
}
}
- 继承
// 接口继承
interface TeacherInfo extends Person {
teach(): string;
}
3. 接口interface 和 类型别名type
- 接口interface 和 类型别名type 相类似,但并不完全一致
- interface没法表示一个基础类型,但是type可以
type Person = string;
4. 完整代码
// 接口interface 和 类型别名type 相类似,但并不完全一致
// interface没法表示一个基础类型,但是type可以
type Person1 = string;
interface Person {
name: string;
// ?表示可有可无的参数
age?: number;
// 如果是readonly修饰,表示这个变量只能被读取,不能进行赋值
readonly sex: string;
// 未来的未知属性,表示这个接口,可以多出其他一个或多个属性,只要满足key为string, 类型为任意类型
[propName: string]: any;
// 定义方法say,返回值是string
say(): string;
}
interface TeacherInfo extends Person {
teach(): string;
}
// 接口自身也可以定义函数
interface SayHi {
(word: string): string;
}
const getPersonName = (person: Person): void => {
console.log(person.name);
};
const setPersonName = (person: TeacherInfo, name: string): void => {
person.name = name;
};
const person = {
name: "dell",
sex: "男",
job: "程序员",
say() {
return "hello";
},
teach() {
return "teach";
},
};
// 将person变量传给getPersonName,进行的是弱校验,即使多了属性也不会报错
getPersonName(person);
// 如果传入的是字面量形式则会进行强校验,报错
getPersonName({
name: "dell",
sex: "男",
job: "程序员",
say() {
return "hello";
},
});
setPersonName(person, "lee");
class UserInfo implements Person {
name = "dell";
sex = "女";
say() {
return "hello";
}
}
const say: SayHi = (word: string) => {
return "sayHi";
};