Skip to content
On this page

类型检查机制

类型检查机制:TypeScript 编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。

作用: 辅助开发,提高开发效率

  • 类型推断

  • 类型兼容性

  • 类型保护

类型推断

不需要指定变量的类型(函数的返回值类型),TypeScript 可以根据某些规则自动的为其推断出一个类型。

  • 基础类型推断
ts
// 推断为 number
let a = 1

// 推断为 any[]
let b = []

// 推断为 c: number
let c = (x = 1) => x + 1
  • 最佳通用类型推断

  • 上下文类型推断

ts
window.onkeydown = (event) => {}

类型断言

ts
interface Foo {
    bar: number
}

let foo = {} as Foo

as const 断言,把类型转换成只读元组

ts
function add() {
    let a = 'mondo'
    let b = (a: number, b: number) => a + b

    return [a, b] as const
}

const [n, m] = add()

m(1, 2)

as 非空断言

ts
const el: HTMLDivElement | null = document.querySelector('.div')

const el: HTMLDivElement = document.querySelector('.div') as HTMLDivElement

const el: HTMLDivElement = document.querySelector('.div')!

接口兼容性

成员少的兼容成员多的

ts
interface X {
    a: any
    b: any
}

interface Y {
    a: any
    b: any
    c: any
}
let x:X = { a: 1, b: 2 }
let y:Y = { a: 1, b: 2, c: 3 }

x = y
// y = x  不能赋值

函数兼容性

ts
type Handler = (a: number, b: number) => void

function hof(handler: Handler) {
    return handler
}
  • 参数个数:多的可以兼容少的
    • 可选参数
    • 剩余参数
    • 固有参数
ts
let handler1 = (a: number) => {}
hof(handler1)

let handler2 = (a: number, b: number, c: number) => {}
// hof(handler2) 报错
  • 参数类型:多的可以兼容少的
ts
let handler3 = (a: string) => {}
// hof(handler3) 报错
  • 函数返回值:少的可以兼容多的
ts
let f = () => ({a: 1})
let g = () => ({a: 1, b: 21})

f = g
// g = f 报错
  • 函数重载:目标函数参数个数多于或者等于源函数参数个数

  • 枚举:数字和枚举可以相互兼容,枚举与枚举间不兼容

ts
enum Fruit { Apple, Banana }
enum Color { Red, Yellow }

let fruit: Fruit.Apple = 3
let no:number = Fruit.Apple
// let color: Color.Red = Fruit.Apple error
  • 类:类的构造函数和静态成员不参与比较,当类中有私有成员时,两个类不兼容,类与子类可以

  • 泛型

    • 泛型接口:在两个泛型参数只有类型不相同时,只有在泛型参数使用时才影响

    • 泛型函数

类型保护

Typescript 能够在特定的区块中保证变量属于某种确定的类型,可以在此区块中放心的引用此类型的属性,或者调用此类型的方法。

ts
class Java {
    helloJava() {}

    java: any
}

class JavaScript {
    helloJs() {}

    javascript: any
}

function isJava(lang: Java | JavaScript):lang is Java {
    return (lang as Java).helloJava !== undefined
}

function getLanguage(type: Type) {
    let lang = type === Type.Strong ? new Java() : new JavaScript()

    // if ((lang as Java).helloJava) {
    //     (lang as Java).helloJava()
    // } else {
    //     (lang as Java).helloJs()
    // }

    // if (lang instanceof Java) {
    //     lang.helloJava()
    // } else {
    //     lang.helloJs()
    // }

    // if ('java' in lang) {
    //     lang.helloJava()
    // } else {
    //     lang.helloJs()
    // }

    if (isJava(lang)) {
        lang.helloJava()
    } else {
        lang.helloJs()
    }
    return lang
}

使用下面三个类型保护

  • instanceof

  • in

  • typeof

  • 类型保护函数