我有以下代码:
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
,我只想在定义之后指定输入。
答案 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();
}
任何类型都是使用现有JavaScript的强大方式, 允许您逐步选择加入并选择退出类型检查 汇编。你可能希望Object扮演类似的角色 用其他语言做。但是Object类型的变量只允许你 为它们分配任何值 - 你不能调用任意方法 他们,甚至是那些真正存在的人
关于any
与Object
的讨论here也很好。