TypeScript联合类型问题

时间:2020-07-07 06:09:55

标签: javascript typescript

我是TypeScript的新手。我正在尝试运行类似的方案,但是它给出了两个错误。我不知道我在这里想念的是什么。谁能帮我解决这个问题?

interface Foo {
    [key: string]: number
};
interface Bar {
    [key: string]: { positive: number, negative: number }
}

// const obj: Foo | Bar = {
//     usa: { positive: 5, negative: 3 },
//     uk: { positive: 4, negative: 1 },
//     fr: { positive: 8, negative: 2 },
// }

const obj: Foo | Bar = {
    usa: 5,
    uk: 3,
    fr: 2,
}

Object.keys(obj).map(key => {
    const val = 'positive' in obj[key] ? obj[key].positive : obj[key];
    alert(val);
})

我遇到的两个错误是:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以在此处使用user defined type guards来让编译器知道您的检查应该缩小了类型。但这仅适用于变量,不适用于表达式,因此您必须首先将其分配给单独的变量。

interface Foo {
    [key: string]: number
};

interface PosNeg {
    positive: number
    negative: number
}

interface Bar {
    [key: string]: PosNeg
}

type FooBar = Foo | Bar

type PossibleValues = FooBar[keyof FooBar]

function isPosNeg(item: PossibleValues): item is PosNeg {
    return typeof item !== "number"
}

const obj: FooBar = {
    usa: 5,
    uk: 3,
    fr: 2,
}

Object.keys(obj).map(key => {
    const item = obj[key]
    const val = isPosNeg(item) ? item.positive : item;
    alert(val)
})