接口约束对象
interface U {
name: string
age: number
}
let user:U = {
name:"孤风",
age:19
}
接口约束函数
interface U {
name: string,
age: number,
sayHi: () => void
}
let user:U = {
name:"孤风",
age:19,
sayHi(){
console.log('Hi');
}
}
interface Condition {
(n:number): boolean
}
function add(numbers:number[], callBack:Condition){
let sum = 0;
numbers.forEach(v => {
if(callBack(v)){
sum += v;
}
});
return sum
}
let sumAdd = add([2,6,7,89,100], v => v % 2 !== 0);
console.log(sumAdd);
接口的继承
- 可以通过接口之间的继承,实现多种接口的组合
- 使用类型别名也可以实现类似的组合效果,需要通过
&
, 叫做交叉类型 - 区别就在于: 子接口不能覆盖父接口的成员, 交叉类型会把相同成员的类型进行交叉 ```javascript // interface U { // name:string // }
// interface U1 extends U { // age:number // } //let user:U1{ // name:”古风”, // age:19 // } //可以继承多个 interface U { name:string }
interface U1 { age:number } interface U2 extends U,U1 { hobby:string } let user:U1{ name:”古风”, age:19, hobby:”戏曲” }
<a name="wExvv"></a>
### readonly 只读修饰符
使用的只读修饰符,当给一个变量进行赋值之后,该变量就不能更改了
```javascript
interface U {
readonly id: string
}
类型兼容性
子结构辨型法:目标类型需要某一些特征,赋值的类型只要能满足该特征即可
- 基本类型: 完全匹配
- 对象类型: 子结构辨型法
类型断言:数据 as 类型
当使用对象字面量赋值的时候,会进行更加严格的判断
面向对象领域中的接口的语义:表达了某个类是否拥有某种能力
某个类具有某种能力,其实,就是实现了某种接口 implements
类型保护函数
通过调用该函数,会触发TS的类型保护,该函数必须返回boolean
function has(ani: object): ani is U {}
接口和类型别名最大的区别在于 接口可以被类实现,而类型别名不可以
接口可以继承类,表示该类的所有成员都在该接口中。