我遇到过这个问题,我似乎无法在 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);
检测为无效?
假设 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']);