打字稿。检查未知类型的变量中是否存在方法/属性

Vit*_*aly 6 javascript typescript

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) {...}
   }
}
Run Code Online (Sandbox Code Playgroud)

和unknown:

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

互联网上的大多数文档都使用某种instanceof方法来检查类型data。但我不太感兴趣data是什么类型。我想知道的是是否存在arrayProp。就是这样

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

Joh*_*ala 5

问题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') {
   }
}
Run Code Online (Sandbox Code Playgroud)

操场