使用 `keyof typeof enum` 作为函数的参数

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

我遇到过这个问题,我似乎无法在 TS 中解决。如果有人能指出我正确的方向,我会很高兴。我有一个返回一系列枚举值的 API,为了使用它们,我在 Typescript 中对它们进行了建模,如下所示:

enum condition = {NEW, USED}

但是,当尝试使用 API 中的数据时,我需要像

typeof keyof condition
那样提示它们,并访问
condition[0]
(在本例中相当于
condition[condition[NEW]]
,这会导致错误消息

Argument of type 'string' is not assignable to parameter of type '"NEW" | "USED"'.(2345)

Typescript 将条件对象导出为

var condition;
(function (condition) {
    condition[condition["NEW"] = 0] = "NEW";
    condition[condition["USED"] = 1] = "USED";
})(condition || (condition = {}));
;

这意味着

condition.NEW
是 0 并且
condition[0]
是新的。 我尝试通过像这样的
as keyof typeof condition
传递它来强制类型:

enum condition {NEW, USED};

function test(param: keyof typeof condition) {
    console.log(param);
}

test(condition[condition.NEW]); // Fails linting, should pass
test(condition[condition.NEW] as keyof typeof condition); // Lint success
test('a' as keyof typeof condition); // Lint success, should fail

(游乐场链接:游乐场

但这充其量只是一种黑客攻击,因为它本质上会忽略输入的类型。我担心现在传递的无效字符串将无法被正确检测到。如何让 TS 检测

test(condition[condition.NEW]);
为有效,并将
test('a' as keyof typeof condition);
检测为无效?

typescript typescript-generics
1个回答
0
投票

假设 API 使用字符串而不是数字来表示枚举值,那么您最好只定义一个 string enum:

enum Condition {
    NEW = 'NEW',
    USED = 'USED'
};

function test(param: Condition) {
    console.log(param);
}

test(Condition.NEW);
test(Condition[Condition.NEW]);
test(Condition['NEW']);
© www.soinside.com 2019 - 2024. All rights reserved.