TypeScript-8.类型推论和兼容性

1.类型推论

  • 基础 
  • 多类型联合
  • 上下文类型

2.类型兼容性

  • 基础 
  • 函数兼容性   参数个数、参数类型、返回值类型、可选参数和剩余参数、参数双向协变、函数重载
  • 枚举 
  • 泛型
    // 类型推论和兼容性
    // 1. 类型推论 基础 多类型联合 上下文类型
    // 2. 类型兼容性 基础 函数兼容性 枚举 类 泛型
    // 函数兼容性 => 参数个数 参数类型 返回值类型 可选参数和剩余参数 参数双向协变 函数重载
    
    // 1.类型推论
    // a.基础
    let vname = 'van' // ts会根据赋值自动判断类型
    // vname = 123 // 报错 上面类型推论为string
    
    // b.多类型联合
    let arr1 = [1, 'a'] // 类型推论 (number|string)[]
    // arr1 = [true, 23, 'aaa', 'bbb'] 报错 不包含boolean
    
    // c.上下文类型
    window.onmousedown = (mouseEvent: any) => {
      console.log(mouseEvent)
    }
    
    // 2. 类型兼容性
    // a.基础(对于对象的检查,是深层次递归检测)
    interface Infos {
      name: string
    }
    let infos: Infos
    const infos1 = { name: 'van' }
    const infos2 = { age: 22 }
    const infos3 = { name: 'dan', age: 13 }
    infos = infos1
    // infos = infos2 报错
    infos = infos3
    
    // b.函数兼容性
    // 参数个数
    let x = (a: number) => 0
    let y = (b: number, c: string) => 0
    y = x
    // x = y 报错  右边参数个数要小于等左边参数个数
    const arrs = [1, 2, 3]
    arrs.forEach((item, index, array) => {
      console.log(item)
    })
    
    // 参数类型
    let x1 = (a: number) => 0
    let y1 = (b: string) => 0
    // x1 = y1 报错
    
    // 可选参数和剩余参数
    const getSum = (arr: number[], callback: (...args: number[]) => number): number => {
      return callback(...arr)
    }
    getSum([1, 7, 3], (...args: number[]): number => args.reduce((a, b) => a + b, 0))  // 灵活一点
    getSum([1, 7, 3], (arg1: number, arg2: number, arg3: number): number => arg1 + arg2 + arg3)
    
    // 函数参数双向协变
    let funcA = (arg: number | string): void => {}
    let funcB = (arg: number): void => {}
    funcB = funcA // ok
    // funcA = funcB 报错
    
    // 返回值类型
    let x2 = (): string | number => 0
    let y2 = () => 'a'
    let z = (): boolean => false
    x2 = y2 // ok
    // y2 = x2 报错
    // y2 = z 报错
    
    // 函数重载
    function merge(arg1: number, arg2: number): number
    function merge(arg1: string, arg2: string): string
    
    function merge(arg1: any, arg2: any) {
      return arg1 + arg2
    }
    merge(1, 3) // 检测返回值为number 没有length属性
    merge('1', '3').length // 检测返回值为string 有length属性
    
    function sum(arg1: number, arg2: number): number
    function sum(arg1: any, arg2: any): any {
      return arg1 + arg2
    }
    let func = merge
    // func = sum 报错 sum缺一种函数重载
    
    // c.枚举的兼容性
    enum StatusEnum{
      On,
      Off
    }
    enum AnimalEnum {
      Dog,
      Cat
    }
    let s = StatusEnum.On
    // s = AnimalEnum.Dog 报错 不兼容
    
    // d.类的兼容性
    class AnimalClass {
      public static age: number
      constructor(public name: string) {}
    }
    class PeopleClass {
      public static age: string
      constructor(public name: string) {}
    }
    class FoodClass {
      constructor(public name: number) {}
    }
    let animal: AnimalClass = { name: 'd'}
    let people: PeopleClass = { name: 'v' }
    let food: FoodClass = { name: 1 }
    people = animal
    // animal = food 报错
    
    class ParentClass {
      private age: number
      constructor() {}
    }
    class ChildrenClass extends ParentClass {
      constructor() {
        super()
      }
    }
    class OtherChass {
      private age: number
      constructor() {}
    }
    
    const children: ParentClass = new ChildrenClass() // 子类可以赋值给父类类型
    // const other: ParentClass = new OtherChass() // 报错 类型有私有属性
    
    // e.泛型兼容性
    interface Data<T> {
      data: T
    }
    let data1: Data<number>
    let data2: Data<string>
    // data1 = data2 报错 不兼容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值