【TS】-类型兼容性

TypeScript的类型兼容性是基于采用结构类型,也就是仅看其成员结构,而不是名义类型

原始类型和对象类型

      interface Named = {
            name: string
      }
      class Person {
            name: string
      }
      let p : Named
      p = new Person()

在以上例子中,虽然p是实现了Named接口,但因为其成员name类型和Person类中的name类型相同。所以不会报错。

       interface Named = {
            name: string
      }
      let x = {name: 'ashen', age: 21}
      let y : Named
      x = y // Error
      y = x // ok

在以上例子中,将y赋值给x,需要检查y中是否有x所需要的所有属性,由于缺少age,所以报错;而x赋值给y时,由于x中有y需要的name属性,且为string类型,所以不报错。

      function sayHi(n : Named){
            console.log('Hi, my name is ' + n.name)
      }
      sayHi(x) // ok

函数比较

      let x = (a: number) => 0
      let y = (a: number, b: string) => 0
      x = y // Error
      y = x // ok

对于函数来说,被赋值的函数的参数,应该包含赋值的函数的参数。例如js中Array的forEach方法,其原本包含三个参数:数组元素、索引、被遍历的数组。但是在使用时,可以如下只传入一个参数:

      let arr = [1, 2, 3]
      arr.forEach(item => {
            console.log(item)
      }
)

下面来看看如何处理返回值不同的函数

      let x = () => ({name: 'ashen'})
      let y = () => ({name: 'ashen', age: 21})
      x = y // ok
      y = x // Error

在TypeScript中强制源函数的返回值类型必须是目标函数返回值类型的子类型

posted @ 2020-12-08 10:47  ashen1999  阅读(28)  评论(0编辑  收藏  举报