在typescript中使用union-typed变量的非共享方法

时间:2016-07-07 03:24:53

标签: javascript typescript

我将javascript库转换为typescript。我遇到了一个问题,其中一个变量可以是布尔值或数组。

由于它是由外部JSON数据提供的,因此无法更改 - 并且由于用户希望数据结构保持不变,因此我无法将其拆分为两个变量。

我的问题是,即使我可以定义一个联合类型,一旦这是一个数组我稍后访问的方法在布尔值上存在 not

所以打字稿抱怨error TS2339: Property 'push' does not exist on type 'boolean | string[]'.

var children: boolean | Array<string>;

children = [];
children.push('test');

这是一个非常简单的代码示例,可以生成我得到的结果。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

  

这是一个非常简单的代码示例,可以生成我得到的结果。我该如何解决这个问题

TypeScript了解JavaScript :)

以下代码在TypeScript latest中运行 fine

var children: boolean | Array<string>;

children = [];
children.push('test');

因为它具有更强大的代码流分析;)

更多

TypeScript版本:https://basarat.gitbooks.io/typescript/content/docs/getting-started.html

如果需要,您可以在当前稳定版本的TypeScript中使用类型保护(我只是移动到最新版本)。有关型号守卫的更多信息:https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html

答案 1 :(得分:0)

您可以使用type guards

if (children instanceof Array) {
    children.push('test');
}

if (typeof children === "boolean") {
    // children is boolean
}

有时你需要做一些比一个班轮console.log更复杂的事情,然后有不同的功能处理不同的可能类型很方便:

var children: boolean | Array<string>;
if (children instanceof Array) {
    useChildrenArray(children);
} else {
    useChildrenBoolean(children);
}

function useChildrenBoolean(children: boolean) { ... }
function useChildrenArray(children: Array<string>) { ... }