# 接口类型
TypeScript 不仅能帮助前端改变思维方式,还能强化面向接口编程的思维和能力,而这正是得益于 Interface
接口类型。
接口用来自定义类型
# 定义对象的类型
/*
interface obj {
属性名:属性值的类型;
}
*/
interface ObjItf {
name: string;
age: number;
}
// 定义对象的类型
let obj: ObjItf = {
name: "张三",
age: 20,
};
console.log(obj); // { name: '张三', age: 20 }
注意:
分隔符
;
接口内的属性必须都得有
# 定义数组的类型
/*
interface arr{
[索引:索引类型]:值类型;
}
*/
interface ArrItf {
// [下标类型]:值类型
// index 可以是任意变量名 , 含义代表索引的意思
[index: number]: number;
}
let arr: ArrItf = [1, 2, 3];
console.log(arr); // [ 1, 2, 3 ]
let arrs:any = [1,"2"]
console.log(arrs); // [ 1, '2' ]
# 定义函数的类型
/*
interface fn{
(形参:形参类型):返回值类型
}
*/
interface ObjItf {
name: string;
age: number;
}
interface FnItf {
(p: ObjItf): void;
}
let fn: FnItf = (obj) => {
console.log(obj.name, obj.age);
};
fn({ name: "小苏同学", age: 18 }); // 小苏同学 18
注意:
- 很少使用接口类型来定义函数的类型,更多使用内联类型或类型别名配合箭头函数语法来定义函数类型;
# 接口继承
多个不同接口之间是可以实现继承的,但是如果继承的接口PersonInfo和被继承的接口NameInfo有相同的属性,并且类型不兼容,那么就会报错。
特点:具有父接口的属性类型
# 多个异名接口的继承
interface NameInfo {
name: string;
}
interface AgeInfo {
age: number;
}
interface PersonInfo extends NameInfo, AgeInfo {
height: number;
}
let obj: PersonInfo = {
name: "张三",
age: 20,
height: 177,
};
多个不同的接口可以实现继承,组合成一个新的接口,那么如果出现多个相同名字的接口会怎么样?
# 多个同名接口的继承
多个相同名字的接口,会进行合并,得到一个新的接口;这个接口的特性一般用在扩展第三方库的接口类型。
interface PersonInfo {
name: string;
age: number;
}
interface PersonInfo {
name: string;
height: number;
}
let obj: PersonInfo = {
name: "张三",
age: 20,
height: 177,
};
# 缺省和只读特性
缺省:表示属性可以省掉,可有可无。
只读:表示属性不能修改
interface PersonInfo {
name?: string; // 缺省
readonly height: number; // 只读
}
let obj: PersonInfo = {
height: 175,
};
obj.height = 180; // 报错,只读属性不能重新赋值
← any与unknown 类型别名 →