# 类型检查
本文基于严格模式:"strictNullChecks": true
# 基础类型:自带的类型约束
# 布尔 数字 字符串
// 布尔 数字 字符串
let isDone: boolean = false
let age: number = 6
let name2: string = 'bob'
# 数组
// 数组
let list1: number[] = [1, 2, 3]
let list2: Array<number> = [1, 2, 3
# 元组
// 元组
let tuple: [string, number] = ['bob', 6]
# 枚举
// 枚举: 使用枚举类型为一组数值赋予友好的名字
enum Color { Red, Green, Blue }
let c: Color = Color.Green // 1
enum Color2 { Red = 1, Green, Blue }
let c2: Color2 = Color2.Green // 2
enum Color3 { Red = 1, Green = 4, Blue = 10 }
let c3: Color3 = Color3.Green // 4
enum Color4 { Red = 1, Green = 4, Blue = 10 }
let fieldName: string = Color4[4] // Green: 通过编号获取枚举名称,注意和索引区分,这里是编号
# Any
// Any: 不进行类型检查
let notSure: any = 4
notSure = 'four'
let list: any[] = [4, 'bob']
# Void
// Void: 空值,只能为undefined或null
let unusable: void = undefine
# Null
// Null: 只能为null
let n: null = null
# Undefined
// Undefined: 只能为undefined
let u: undefined = undefined
# Never
// Never: 无返回值
// 不同于void, void是返回值为undefined或null
// never通常是函数抛出异常或者死循环导致没有返回值
function error(): never {
throw Error('unknown error')
}
# Object
// Object: 对象类型
let person: object = { name: 'bob' }
# 类型断言:打破方法调用限制
// 类型断言: 对于any类型,我们无法调用string类型的方法
// 我们可以通过类型断言将any类型转成其他类型,然后就可以调用相关方法了
let value: any = 'hello'
let str1: number = (<string>value).length
let str2: number = (value as string).lengt
# 接口:自定义类型约束
接口用于为自定义对象定义类型约束。
# 基础用法
interface Person {
name: string
age: number
}
const p: Person = { name: 'zhuli', age: 20 }
# 可选属性
interface Person {
name: string
age?: number // 可选
}
const p: Person = { name: 'zhuli'}
# 只读属性
interface Person {
name: string
readonly age: number
}
const p: Person = { name: 'zhuli', age: 20 }
p.age = 18 // error
# 函数类型
通过接口定义函数类型
interface SendMessage {
(msg: string): boolean
}
let sendMsg: SendMessage = function (msg: string) {
return true
}
# 类类型
通过接口定义类的协议,类似Java中的Interface
interface Animal {
name: string
eat(food: string): void
}
class Dog implements Animal {
name: string = 'wangcai'
eat(food: string) {
console.log(`eat ${food}`)
}
run() {
console.log('running')
}
}
# 接口继承
interface Gender {
gender: string
}
interface Age {
age: number
}
interface Person extends Age,Gender {
name: string
}
const p: Person = {
name: 'zhuli',
age: 20,
gender: 'female'
}