TypeScript笔记 —— TypeScript类型

100 阅读2分钟

TypeScript类型 - any类型

在某些情况下,我们确实无法确定一个变量的类型,并且可能它会发生一些变化,这个时候我们可以使用any类型(类似于Dart语言中的dynamic类型)。any类型有点像一种讨巧的TypeScript手段:我们可以对any类型的变量进行任何的操作,包括获取不存在的属性、方法;我们给一个any类型的变量赋值任何的值,比如数字、字符串的值。

let a: any = "haha";
a = 123;
a = true;
const aArray: any[] = ["haha", 18, 1.88] 

如果对于某些情况的处理过于繁琐不希望添加规定的类型注解,或者在引入一些第三方库时,缺失了类型注解,这个时候我们可以使用any,包括在Vue源码中,也会使用到any来进行某些类型的适配。

TypeScript类型 - unknown类型

unknown是TypeScript中比较特殊的一种类型,它用于描述类型不确定的变量。和any类型有点类似,但是unknown类型的值上做任何事情都是不合法的。什么意思呢?我们来看下面的场景。

function foo(): string {
    return 'foo'
}

function bar(): number {
    return 123
}

const flag = true
let result: unknown
if(flag) {
    result = foo()
}else {
    result = bar()
}
if(typeof result === 'string') {
    console.log(result.length)
}

TypeScript类型 - void类型

void通常用来指定一个函数是没有返回值的,那么它的返回值就是void类型。

function sum(num1: number, num2: number) {
    console.log(num1 + num2)
}

这个函数我们没有写任何类型,那么它默认返回值的类型就是void的,我们也可以显示的来指定返回值是void。

function sum(num1: number, num2: number):void {
    console.log(num1 + num2)
}

这里还有一个注意事项,我们可以将undefined赋值给void类型,也就是函数可以返回undefined。

当基于上下文的类型推导(Contextual Typing)推导出返回类型为 void 的时候,并不会强制函数一定不能返回内容。

type FnType = () => void
const foo: FnType = () => {
    return 123
}

const names = ["abc", "cba", "nba"]
names.forEach(item => item.length)

TypeScript类型 - never类型

never 表示永远不会发生值的类型,比如一个函数数中是一个死循环或者抛出一个异常,那么这个函数会返回东西吗?不会,那么写void类型或者其他类型作为返回值类型都不合适,我们就可以使用never类型。

function loopFun(): never {
    while(true) {
        console.log("123")
    }
}

function loopErr(): never {
    throw new Error()
}

function handleMessage(message: number | string) {
    switch(typeof message) {
        case 'string':
            console.log('foo')
            break
        case 'number':
            console.log('bar')
            break
        default: 
            const check: never = message 
    }
}