打字稿:类型谓词总是返回never

问题描述 投票:0回答:1

我正在尝试使用 type 谓词,特别是

isSomeId
函数,根据 key 属性缩小
SomeU
对象数组的类型。目标是找到键等于
Keys.SOME_ID
的项目。但是,似乎
isSomeId
函数给了我一个以下错误:

类型谓词的类型必须可分配给其参数的类型。 输入 '{ key: Keys.SOME_ID;类型:过滤器类型;值:字符串; }' 不可分配给类型“SomeU”。 输入 '{ key: Keys.SOME_ID;类型:过滤器类型;值:字符串; }' 不可分配给类型 '{ key: Keys;类型:FilterType.ONE_OF;值:字符串[]; }'。 属性“type”的类型不兼容。 类型“FilterType”不可分配给类型“FilterType.ONE_OF”。

我遵循了有关类型谓词的 TypeScript 文档,并相应地创建了

isSomeId
函数。我期望这个函数能够正确推断类型,但似乎有些东西没有按预期工作。

此外,我正在探索直接从

SomeU
类型推断预期类型的可能性。我尝试使用 Extract 实用函数来实现此目的,但它始终不返回。为了说明这一点,我尝试将类型谓词函数转换为如下所示:

function isSomeId(a: SomeU): a is Extract<SomeU, { key: Keys.SOME_ID }>

任何有关如何解决此问题并获得变量的正确类型推断的见解或建议将不胜感激。还附上TS Playground的链接。

enum Keys {
    SOME_NAME = "SOME_NAME",
    SOME_ID = "SOME_ID",
}

enum FilterType {
    EQUAL = "EQUAL",
    INCLUDE = "INCLUDE",
    ONE_OF = "ONE_OF"
}

type SomeU =
    | { key: Keys; type: FilterType.EQUAL, value: string}
    | { key: Keys; type: FilterType.INCLUDE, value: string}
    | { key: Keys; type: FilterType.ONE_OF, value: string[] };

type A = SomeU[];

function isSomeId(a: SomeU): a is { key: Keys.SOME_ID, type: FilterType, value: string } {
    return a.key === Keys.SOME_ID && a.type === FilterType.EQUAL;
}

const someArr: A = [
    { key: Keys.SOME_ID, type: FilterType.EQUAL, value: "some"},
    { key: Keys.SOME_NAME, type: FilterType.EQUAL, value: "some"},
    { key: Keys.SOME_NAME, type: FilterType.ONE_OF, value: ['some']},
];

const s = someArr.find(isSomeId);
javascript typescript union unions discriminated-union
1个回答
0
投票

您的谓词函数返回

type: FilterType
而不是
type: FilterType.EQUAL
,这是我认为您应该调整的主要内容,特别是因为这是您在函数体中检查的内容。

function isSomeIdWithEqualType(
    a: SomeU
): a is { key: Keys.SOME_ID; type: FilterType.EQUAL; value: string } {
    return a.key === Keys.SOME_ID && a.type === FilterType.EQUAL;
}
© www.soinside.com 2019 - 2024. All rights reserved.