打字稿联合类型typeguards

时间:2017-01-04 05:31:28

标签: javascript angular typescript types

我有一个这样的片段:

function test(): any[] | string {
  return [1,2]
}

let obj: any[]  = test();

这在vscode中出现以下错误:

[ts] Type 'string | any[]' is not assignable to type 'any[]'.
       Type 'string' is not assignable to type 'any[]'.

我知道我必须提供一些警卫,但不能理解这里的概念。有人请吗?

2 个答案:

答案 0 :(得分:0)

函数test()返回由变量声明的any[]的“更宽”类型,并且到目前为止,作为打字稿不能事先验证函数将始终返回数组实例 - 它会抱怨。要解决此问题,您应该实际使用您提到的typeguards,例如

function test(): any[] | string
{
    return [1, 2];
}

let val = test();
if (val instanceof Array)
{//no error here
    let obj: any[] = val;
}

答案 1 :(得分:0)

使用类型保护,Typescript可以缩小联合类型。您可以简单地使用缩小条件,但添加类型保护功能可为您提供额外的可重用性和灵活性:

function isAnyArray(value: any[] | string): value is any[] {
    return value instanceof any[];
}

所以你可以定期完成作业,然后在你的打样员提供的范围内工作:

let obj: string | any[] = test();

if (isAnyArray(obj)) {
    //Use obj here as if it were an any[]
}

由于您在多个地方使用联合,您可以为它定义一个类型并使用它来代替手动联合类型:

type StringOrAnyArray = string | any[];
//...
function isAnyArray(value: StringOrAnyArray): value is any[] {
    return value instanceof any[];
}
//...
let obj: StringOrAnyArray = test();

if (isAnyArray(obj)) {
    //Use obj here as if it were an any[]
}