在 TypeScript 中,可以在变量初始化之后声明变量类型。

4

我有以下代码:

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个回答

2
我熟悉的习语是声明一个更窄的临时变量,然后将其重新赋值给更宽的类型变量。例如:
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问题中所看到的,没有人甚至考虑实现你想要的类型缩小控制流。因此,在我看来,临时变量是唯一合理的方法。


0
你可以使用类型断言,像这样:

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

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

-6

你可以使用 any。然后 item 可以是任何东西而不会出现编译错误。

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

来自TS文档

任意类型是一种与现有JavaScript一起工作的强大方式,允许您逐渐选择在编译期间进行类型检查。您可能希望Object在其他语言中扮演类似的角色。但是,类型为Object的变量仅允许您将任何值分配给它们-您不能在它们上调用任意方法,即使存在这样的方法。

这里也有关于anyObject的良好讨论。


这个解决方案完全打败了首次输入变量的目的(可以说是使用typescript的整个目的)。虽然它有其用例,但我希望在这里找到一个更优秀的解决方案。 - perennial_
我完全同意。然而,如果你无法控制item将会是什么(看起来你无法控制),那么你可能需要使用any的灵活性。 - nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接