接口约束对象
interface U {name: stringage: 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 只读修饰符使用的只读修饰符,当给一个变量进行赋值之后,该变量就不能更改了```javascriptinterface U {readonly id: string}
类型兼容性
子结构辨型法:目标类型需要某一些特征,赋值的类型只要能满足该特征即可
- 基本类型: 完全匹配
- 对象类型: 子结构辨型法
类型断言:数据 as 类型
当使用对象字面量赋值的时候,会进行更加严格的判断
面向对象领域中的接口的语义:表达了某个类是否拥有某种能力
某个类具有某种能力,其实,就是实现了某种接口 implements
类型保护函数
通过调用该函数,会触发TS的类型保护,该函数必须返回boolean
function has(ani: object): ani is U {}
接口和类型别名最大的区别在于 接口可以被类实现,而类型别名不可以
接口可以继承类,表示该类的所有成员都在该接口中。
