TS v3.x带来了新的类型:unknown。但是还不清楚如何轻松使用此类型而不是any
示例:您正在使用一些没有类型的第三方库。而且您没有时间自己编写这些类型。您需要处理该库提供的一些数据。

unknown之前:

function handle(data: any) {
   if (data && data.arrayProp && typeof data.arrayProp[Symbol.iterator] === 'function') {
       for (let x of data.arrayProp) {...}
   }
}

unknown:
function handle(data: unknown) {
   // this line gives TS error: `data` is unknown type
   if (data && data.arrayProp && typeof data.arrayProp[Symbol.iterator]=== 'function') {
...

互联网上的大多数文档都使用某种instanceof方法来检查data的类型。但是我对data的类型不是很感兴趣。我想知道的是那里是否有arrayProp。而已

如何使用unknown类型做到这一点?

最佳答案

unknown的作用是您必须先缩小其类型,然后才能使用它。您可以为此使用自定义类型防护:

interface ArrayProp {
  arrayProp: []
}
function isArrayProps(value: unknown): value is ArrayProp {
  return !!value && !!(value as ArrayProp).arrayProp;
}

function handle(data: unknown) {
   if (isArrayProps(data) && typeof data.arrayProp[Symbol.iterator] === 'function') {
   }
}

Playground

10-04 15:58
查看更多