在初始声明打字稿之后声明变量类型



我有以下代码:

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,我只想在定义后指定键入。

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

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 作斗争,这通常是徒劳的。 祝你好运!

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

您可以使用类型断言,如下所示:

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

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

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

从 TS 文档中:

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

这里也有一个关于anyObject.

最新更新