unknown 是什么类型,详细讲一下【热度: 801】

关键词:unknown类型、unknown类型应用

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

const num: number = 10;
(num as unknown as string).split('');          // 注意,这里和any一样完全可以通过静态检查

这个时候unknown的作用就跟any高度类似了,你可以把它转化成任何类型,不同的地方是,在静态编译的时候,unknown不能调用任何方法,而any可以。

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

unknown的一个使用场景是,避免使用any作为函数的参数类型而导致的静态类型检查bug:

function test(input: unknown): number {
  if (Array.isArray(input)) {
    return input.length;    // Pass: 这个代码块中,类型守卫已经将input识别为array类型
  }
  return input.length;      // Error: 这里的input还是unknown类型,静态检查报错。如果入参是any,则会放弃检查直接成功,带来报错风险
}

我们在一些无法确定函数参数(返回值)类型中 unknown 使用的场景非常多

// 在不确定函数参数的类型时
// 将函数的参数声明为unknown类型而非any
// TS同样会对于unknown进行类型检测,而any就不会
function resultValueBySome(val:unknown) { 
  if (typeof val === 'string') {  
    // 此时 val 是string类型   
    // do someThing 
  } else if (typeof val === 'number') { 
    // 此时 val 是number类型   
    // do someThing  
  } 
  // ...
}