# 类型检查

本文基于严格模式:"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' 
}
上次更新: 2/13/2025, 3:29:47 AM