在TypeScript中,对象返回两种类型的并集,但会生成错误

时间:2016-09-04 19:33:23

标签: typescript

在TypeScript中,对象返回两种类型的并集,但会生成错误。

这是主要方法:

public getSelected(): ISimpleListItem | { [key: string]: ISimpleListItem } { if (this.multiSelect) // true of false return this.m_metadata; // metadata is when MANY ISimpleListItem returned

// single ISimpleItem returned    
for (let v in this.m_metadata) {
        if (this.m_metadata[v].selected == true)
            return this.m_metadata[v];
    }
}

```

注意它既可以返回单个ISimpleListItem,也可以返回持有MANY ISimpleListItem的对象文字

界面:

 export interface  ISimpleListItem {
        item: any,
        index: number,
        selected: boolean
    }

在这种情况下使用simpleList.getSelected()的方法只接收一个ISimpleList项

private onSelecting(event) { var orderSelected:ISimpleListItem = this.simpleList.getSelected(); this.selectedAdnetPackageModel = orderSelected.item; }

你可以在这里看到来源:

https://github.com/born2net/studioDashboard/blob/master/src/comps/app1/adnet/network/AdnetNetworkPackageEditor.ts

https://github.com/born2net/studioDashboard/blob/master/src/comps/app1/adnet/network/

然而错误仍然存​​在:

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我理解你的话:

let myObject: { [key: string]: ISimpleListItem } = {
    "key1": {
        index: 1,
        item: "something",
        selected: true
    }
};

code in playground

修改

联合类型是它自己的一种类型,你不能把它看作是联合中的一种类型而不让编译器知道你引用的类型。
有几种方法可以做到这一点:

(1)Type assertion

function getit(): string | { [key: string]: string } {
    return null;
}

let a = getit();
console.log(a.length); // error: Property length does not exist on type 'string | { [key: string]: string; }
console.log((a as string).length); // ok

(2)Type guards

if (typeof a === "string") {
    console.log(a); // ok
}

code in playground