接口和类型兼容

扩展类型 -接口哦

扩展类型: 类型别名,枚举,接口,类

TypeScript的接口:用于约束类,对象,函数的契约(标准)

契约(标准)的形式:

  • API文档,弱标准。
  • 代码约束,强标准。
  1. 接口约束对象。

接口约束对象的时候和类型别名没什么区别,接口最大的区别就是约束类

  1. interface User{
  2. name : string,
  3. age : number,
  4. }
  5. let u:User = {
  6. name : "宇威",
  7. age : 22
  8. }
  1. 接口约束函数
  1. interface User{
  2. name : string,
  3. age : number,
  4. sayHello() : void,
  5. }
  1. 接口可以继承
  1. interface A{
  2. T1 : string,
  3. }
  4. interface B extends A{
  5. T2 : number,
  6. }
  7. let u : B = {
  8. T1 : 'AYuWei',
  9. T2 : 123
  10. }

可以通过接口之间的继承,实现多种接口的组合

readonly

只读修饰符,修饰的目标是只读。

只读修饰符不存在编译结果中。

  1. interface Point {
  2. readonly x: number;
  3. readonly y: number;
  4. }

类型兼容性。

B -> A, 如果能完成复制,则B和A类型兼容。

鸭子辩型法(子结构辩型法):目标类型需要某一些特征,复制的类型只要能满足该特征即可。

  • 基本类型:完全匹配
  • 对象类型:鸭子辩型法。

当直接使用对象字面量赋值的时候,会进行更加严格的判断。

类型断言:我们使用的类型比如说是字符串的时候,会判断这个类型就是字符串,但是我们可以将这个类型提示改为其他的类型,"数据" as "类型"

  1. interface Duck{
  2. sound : "嘎嘎嘎"
  3. swin() : void,
  4. }
  5. let person = {
  6. name : "伪装成鸭子的人",
  7. age : 11,
  8. sound : "嘎嘎嘎" as "嘎嘎嘎", // 类型断言
  9. swin(){
  10. console.log(this.name + "正在游泳,并发出了" + this.sound + "的叫声!")
  11. }
  12. }
  13. let duck : Duck = person;
  14. console.log(duck.swin()); // 但是不能使用 duck.name,因为鸭子里面没有name
  • 函数类型

参数:传递给目标函数的参数可以少,但是不可以多。

  1. interface Condition {
  2. (n : number, i : number) : boolean;
  3. }
  4. function sum(number : number[], callBack : Condition){
  5. let s = 0;
  6. for(let i = 0 ; i < number.length ; i ++){
  7. const n = number[i];
  8. if(callBack(n, i)){
  9. s += n;
  10. }
  11. }
  12. return s;
  13. }
  14. const result = sum( [2,3,4,5,6], n => n % 2 !== 0 );
  15. console.log(result)