• 【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中强制源函数的返回值类型必须是目标函数返回值类型的子类型

  • 相关阅读:
    前人风采
    【C++ Primer 第16章】1. 定义模板 (一)
    CCF CSP认证考试试题
    【C++ Primer 第11章】4. 无序容器
    【C++ Primer 第11章 练习答案】2. 关联容器操作
    【C++ Primer 第11章】2. 关联容器操作
    dxRatingControl使用
    dxRangeTrackBar使用教程
    UniConnectDialog使用
    Delphi窗体置顶及失去焦点后取得焦点
  • 原文地址:https://www.cnblogs.com/ashen1999/p/14101400.html
Copyright © 2020-2023  润新知