联合类型(Union Types)
使用|分隔的每个类型.
注意事项:当联合类型不确定是哪个类型时,只能访问联合类型的所有属性的共有属性或方法。
当访问独有类型时,ts会发出报错。那么,怎么进行类型保护呢?
- 使用类型断言.
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)
}
}
- 使用
in语法
function func2(arg: A | B) {
if('age' in arg) {
console.log(arg.age)
} else {
console.log(arg.sex)
}
}
- 使用
typeof - 使用 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 和 类型别名 的区别之处?
函数有哪几种表现形式?