此页内容
前端TypeScript

unknown 类型应用场景

约 340 字大约 1 分钟

typescript

2022-04-02

unknown 类型 表示 不可预先定义的类型,在很多场景下,它可以代替 any 类型的功能 的同时,保留静态检查的能力。

类型转换

const const num: numbernum: number = 10;
(const num: numbernum as unknown as string).
String.split(separator: string | RegExp, limit?: number | undefined): string[] (+1 overload)
Split a string into substrings using the specified separator and return them as an array.
@paramseparator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.@paramlimit A value used to limit the number of elements returned in the array.
split
('')
这里可以和 any 一样通过静态检查

这个例子可以看出, unknown 类型的作用和 any 类型的作用非常相似,你可以把它转换为任何类型。 区别在于,any 在静态编译时可以调用任何方法,但 unknown 类型在静态编译时是不可以调用任何方法的

const const foo: unknownfoo: unknown = 'string'
foo.substr(1);           // 静态检查不通过报错
'foo' is of type 'unknown'.
const const bar: anybar: any = 10 const bar: anybar.substr(1);

替代 any

大多数情况下,我们可以选择使用 unknown 替代 any,从而避免由于使用 any 而带来的 静态类型 检查的失效。

如,避免使用 any 作为 函数参数类型,使用 unknown 替代。

使用 any,静态检查失效:

function function test(input: any): numbertest(input: anyinput: any): number {
  if (var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(input: anyinput)) {
    return input: any[]input.Array<any>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length
} return input: anyinput.length }

使用 unknown,静态检查正确推断:

function function test(input: unknown): numbertest(input: unknowninput: unknown): number {
  if (var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(input: unknowninput)) {
    // 类型守卫将input识别为array类型
    return input: any[]input.Array<any>.length: number
Gets or sets the length of the array. This is a number one higher than the highest index in the array.
length
} // input是unknown类型,静态检查报错 return input.length
'input' is of type 'unknown'.
}