TypeScript 类型(type)

TypeScript语言既然命名中有 Type ,也就表明这项语言注重于类型检测: 和 静态类型检测 语言(在不运行代码情况下检测代码中的错误)一样,TypeScript在执行前检查程序是否有错误,并根据值的类型进行检查。

  • 建议采用明确的变量类型声明,以便编译器能够自动找出明显的类型错误

对象

  • 使用 {} 创建对象:

把值声明为object类型
let a: object = {
    b: 'x'
}
  • 结构中声明变量类型:

简单的TypeScript对象
let c: {
    firstName: string
    lastName: string
} = {
    firstName: 'john',
    lastName: 'barrowman'
}

和类相同:

类声明
class Person {
    constructor(
        public firstName: string,
        public lastName: string
    )
}{}

c = new Person('matt', 'smith')

类型别名(Type Aliases)

使用类型别名(Type Aliases, 建议命名采用首字母大写)可以帮助我们定义更容易理解的结构:

类型别名(Type Aliases)案例
type Age = number

type Person = {
    name: string
    age: Age
}

let age: Age = 55

let driver: Person = {
    name: 'Jame'
    age: age
}

并集(union)类型和交集(intersection)类型

TypeScript提供了特殊的类型运算符来处理类型的并集和交集:

  • 并集使用 |

  • 交集使用 &

并集(union)和交集(intersection)
type Cat = {
    name: string,
    purrs: boolean
}

type Dog = {
    name: tring,
    barks: boolean,
    wags: boolean
}

type CatOrDogOrBoth = Cat | Dog
type CatAndDog = Cat & Dog

//Cat
let a: CatOrDogOrBoth = {
    name: 'Bonkers',
    purrs: true
}

// Dog
a = {
    name: 'Domino',
    barks: true,
    wags: true
}

// 两者兼具
a = {
    name: 'Donkers',
    barks: true,
    purrs: true,
    wags: true
}

数组(array)

  • 数组 [] 是特殊类型对象,支持拼接,推入,搜索和切片

  • 一般情况下,数组中类型应该同质: 要么存储数字要么存储字符串,这样如果有不同类型的数据推入,TypeScript可以提示错误,方便程序排障

简单的数组类型示例
let a = [1, 2, 3]
var b = ['a', 'b']
let c: string[] = ['a']
let d = [1, 'a']
const e = [2, 'b']

let f = ['read']
f.push('blue')  // 推入数据必须是同类型的,例如如果 f.push(true) 就会报错

let g = [] //这里没有声明类型,TypeScript会假设为 any类型 ,这样推入任何类型都可以通过,但是不利于检测错误
g.push(1)
g.push('red')

let h: number[] = [] //这里设置了数组f是数字类型
h.push(1) //只能推入数字,不能推入字符串,也就是 h.push('read') 会报错

元组(tuple)

元组是数组的子类型,是定义数组的一种特殊方法:

  • 元组长度固定

  • 元组的各个索引位上的值具有固定的已知类型

  • 声明元组的时候必须显式注解类型

简单的元组类型示例
let a: [number] = [1]

//[名,姓,出生年月]
let b: [string, string, number] = ['malcolm', 'gladwell', 1963]

元组支持可选的元素,在对象的类型中 ? 表示可选:

简单的元组类型示例(可选字段)
let transFares: [number, number?][] = [
    [3.75],
    [8.25, 7.70],
    [10.50]
]

//等价于
let moreTransFares: ([number] | [number, number])[] = [
    // ...
]

枚举(enum)

简单的枚举类型示例
enum Language {
    English,
    Spanish,
    Russian
}

// 枚举中的值使用点号或方括号表示法访问,就像访问常规对象中的值:
let myFirstLanguage = Language.Russian
let mySecondLanguage = Language['English']

enum Language {
    English = 0,
    Spanish  =1
}

//枚举的值可以是字符串,或者混用字符串和数字
enum Color {
    Red = '#c10000',
    Blue = '#007ac1',
    Pink = 0xc10050,
    White = 255
}

参考

  • O’REILLY 《TypeScript编程》