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

时间:2019-08-28 16:30:41

标签: 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) {...}
   }
}

使用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类型执行此操作?

1 个答案:

答案 0 :(得分:2)

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