typescript入门笔记

166 阅读1分钟

联合类型(Union Types)

使用|分隔的每个类型.

注意事项:当联合类型不确定是哪个类型时,只能访问联合类型的所有属性的共有属性或方法。
当访问独有类型时,ts会发出报错。那么,怎么进行类型保护呢?

  1. 使用类型断言.
interface A {
  name: 'g',
  age: 21
}
interface B {
  name: 'j',
  sex: '男'
}
function func(arg: A | B) {
  if(arg.name === 'g') { // 利用共有属性,逻辑上判断
    console.log((arg as A).age)
  } else {
    console.log((arg as B).sex)
  }
}
  1. 使用in语法
function func2(arg: A | B) {
  if('age' in arg) {
    console.log(arg.age)
  } else {
    console.log(arg.sex)
  }
}
  1. 使用typeof
  2. 使用 instanceof 等可以明确判断其是哪个类型时,就可以去除ts报错

枚举类型

使用enum关键字定义。

    enum Name {
        A,
        B
    }
  • 默认情况下,枚举的类型是从0开始的。可以手动赋值来修改。没赋值的后面元素依次增加
  • 枚举类型可以反向取值:Name.A <==> Name[0]
  • 注意:若是没赋值的元素(其值由依次增加而来).与已赋值的元素相同,ts并不会知道。且后面的元素会覆盖前面的元素

泛型

函数泛型

    function func<T> (arg: T) {
        ...
    }

类泛型

    class cls<T> {
        
    }

泛型主要是指,在定义函数,类或接口时不指定具体类型,而在使用时再指定类型的一种特性
可以使用extends约束泛型
比如:约束指定的泛型类型包含name属性

    interface HasName { // 
        name: string
    }
    function func<T extends HasName> {
        ...
    }

再比如:约束泛型类型时number或者string

    function func<T extends number | string> () {
        ...
    }

使用keyof来约束泛型只能取某些

interface元组 的相似之处?

interface类型别名 的区别之处?

函数有哪几种表现形式?