1 Interface 接口
- 对对像的形状(shape)进行描述
- 对类(class)进行抽象
- Duck Typing(鸭子类型)
接口名称一般的规范首字母为I
大写,这个是约定,如下:
interface IPerson {
name: string;
age: number;
}
let viking: IPerson = {
name: 'viking',
age:1
}
可选属性:
interface IPerson {
name: string;
age?: number;
}
let viking: IPerson = {
name: 'viking',
}
只读属性:
interface Person {
readonly id: number;
name: string;
age?: number;
}
let viking: Person = {
id: 1234,
name: 'viking',
}
注意:readonly 和 cosnt 区别为,readonly 是用在属性上面,而 cosnt 是用在变量上的。
- 字面量和变量赋值注意事项:
interface IPerson {
// readonly name: string;
name: string;
age: number;
sex?: string;
say(): void; // 方法
write(w: string): string; // 方法
// [propName: string]: any; // 可选类型,必须指定 propName 类型
}
function setPerson(person: IPerson, name: string): void {
person.name = name;
}
const person = {
name: 'xiaoli',
age: 11,
say(){},
write(w: string){
return w;
},
hi(){}, // 多出来的方法
year: 2011, // 多出来的属性
}
// 通过变量赋值,TS 不会强校验,只有满足 IPerson 中,该有的属性即可
setPerson(person, 'xiaoming');
// 通过字面量赋值,则 TS 会强校验,多出来的属性就会报错,要求接口也需要定义
setPerson({
name: 'xiaoli',
age: 11,
say(){},
write(w){
return '';
},
year: 2011, // 报错!!!
hi(){}, // 报错!!!
}, 'xiaoming');
// 通过变量赋值,TS 不会强校验,只有满足 IPerson 中,该有的属性即可
let viking: IPerson = person;
// 通过字面量赋值,则 TS 会强校验,多出来的属性就会报错,要求接口也需要定义
let viking2: IPerson = {
name: 'viking',
age: 1,
say(){
console.log('..')
},
write(word){
return word;
},
year: 2011, // 报错!!!
}
上面示例方法说明,通过变量赋值,TS 不会强校验,只有满足接口 IPerson 中,该有的属性即可,多出来属性也不会报错
;如果直接通过字面量赋值,则 TS 会强校验,多出来的属性就会报错
,要求接口也需要
- 接口和类型别名的区别:
接口和类型别名基本一样,但是,也有一些不同,类型别名可以定义基础类型,而借口只能是对象类型,一般,我们约定可以使用接口,就不要使用类型了:
type tUser = string; // 可以定义基础数据类型
// interface IUser = string; // 接口,不能定义基础数据类型,语法直接报错
type tUser1 = {
name: string;
}
interface IUser {
name: string;
}
2 接口和类
- 类通过 implements 实现相关的接口
interface Radio {
switchRadio(): void;
}
class Car implements Radio{
switchRadio() { }
}
class Cellphone implements Radio {
switchRadio() { }
}
- 实现多个接口
interface Radio {
switchRadio(): void;
}
interface Battery {
checkBatteryStatus();
}
class Cellphone implements Radio, Battery {
switchRadio() { }
checkBatteryStatus() { }
}
- 接口继承其他接口,拥有整合其他接口
interface Radio {
switchRadio(): void;
}
// 接口继承 Radio,拥有 Radio 接口方法
interface RadioWithBattery extends Radio {
checkBatteryStatus();
}
class Cellphone implements RadioWithBattery {
switchRadio() { }
checkBatteryStatus() { }
}
网友评论