TypeScript——any、unknown 和泛型

877 阅读1分钟

Any

function identity(arg: any) : any {
    return arg;
}

使用any类型会导致这个函数可以接收任何类型的arg参数

any类型可能出现传入的类型和返回的类型不相同。比如:我们传入一个数字,但任何类型的值都可能被返回。

泛型 / 变量类型 T

function identity<T>(arg: T) : T {
    return arg
}

我们给identity函数添加了类型变量T。变量类型T 帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。之后我们再次使用了T作为返回值类型,这样我们就可以保证参数类型和返回值类型是相同的。

这个版本的identity函数叫做泛型,因为它可以适用于多个类型。

Any 和 泛型 的区别

泛型可以确保参数类型和返回值类型一致, Any不可以。

调用泛型函数

方式一: 传入所有的参数,包含类型参数

let output = identity<string>("myString");

方式2: 利用类型推论--即编译器会根据传入的参数自动的帮助我们确定T的类型

let output = identity("myString")

注意:我们没必要使用尖括号(<>)来明确的传入类型;编译器可以查看myString 的值,然后把T设置为它的类型。类型推论帮助我们保持到吗精简和高可读性。如果编译器不能够自动的推断出类型的话,只能像上面那样明确的传入T的类型,在一些复杂的情况下,这是可能出现的。

泛型约束(extends关键字实现约束)

interface Lengthwise {
    length: number
}

function loggingIdentity<T extends Lengthwise>(arg : T) : T {
    console.log(arg.length)
}

unknown

如果是any,你可以任意的取值赋值,不会进行任何的类型检查

unkown,必须先解析断言 就是使用typeof 或 instanceof来判断类型