我有一个这样的片段:
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[]'.
我知道我必须提供一些警卫,但不能理解这里的概念。有人请吗?
答案 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[]
}