在初始声明typescript

时间:2017-07-26 21:10:39

标签: typescript

我有以下代码:

let item = object[] | object;
if (a === true) {
    item = [];
    // would like to do something like item: object[] = []
    (item as object[]).push(...);
else if (b === true) {
    item = {};
    // would like to do something like item: object = {}
    (item as any).prop = ...
}
// do stuff with item

我的问题是,因为item可以是对象或对象列表,所以我必须转换item,以便打字稿允许我使用它。有没有办法在初始化时声明对象的类型,所以这些转换是不必要的?

为了澄清,我想要输入item,我只想在定义之后指定输入。

3 个答案:

答案 0 :(得分:1)

您可以使用Type Assertion,如下所示:

let item: Any 
if ( some condition ) {
let mynewtype = (item as string)
// use mynewtype as string }

答案 1 :(得分:0)

我熟悉的习惯是声明一个更窄类型的临时变量,然后将其分配回更宽类型的变量。例如:

type IndexableObject = { [k: string]: any };
let item: IndexableObject[] | IndexableObject;
declare let a: boolean;
declare let b: boolean;
if (a === true) {
    let itemArray: IndexableObject[] = [];
    itemArray.push({ hey: 'you' }, { whats: 'up' });
    item = itemArray;    
} else if (b === true) {
    let itemObject: IndexableObject = {};
    itemObject.prop = 'hello';
    item = itemObject;
}

我知道你宁愿不介绍这样的变量,但我的经验是,做其他任何事情只是与TypeScript斗争,而这通常是徒劳的。祝你好运!

编辑:看起来你基本上遇到了this situation。正如您在GitHub问题中看到的那样,没有人会考虑实现您想要的那种类型缩小控制流。因此,就我所见,临时变量是唯一合理的方法。

答案 2 :(得分:-3)

您可以使用any。然后item可以是没有编译器错误的任何东西。

let item: any;
if (a) {
   item = [];
   item.push('new thing');
} else {
   item.prop();
}

来自TS documentation

  

任何类型都是使用现有JavaScript的强大方式,   允许您逐步选择加入并选择退出类型检查   汇编。你可能希望Object扮演类似的角色   用其他语言做。但是Object类型的变量只允许你   为它们分配任何值 - 你不能调用任意方法   他们,甚至是那些真正存在的人

关于anyObject的讨论here也很好。