如何解决如何以类型安全的方式迭代记录类型对象的枚举属性?
以下代码有效(但需要消除类型检查错误):
enum ParametricTable {
A = 'a',B = 'b'
}
type Database = Record<ParametricTable,number>;
const database: Database = {
[ParametricTable.A]: 41,[ParametricTable.B]: 42
};
for (let parametric_table in database) {
// @ts-expect-error
const value: number = database[parametric_table];
if (value===undefined)
throw 'weird - this should never be undefined';
else
console.log(value);
}
以上代码在标准输出上正确打印了41和42。
下面的代码进行类型检查,但会引发异常:
enum ParametricTable {
A = 'a',[ParametricTable.B]: 42
};
for (let parametric_table in database) {
const value: number = database[ParametricTable[parametric_table as keyof typeof ParametricTable]];
if (value===undefined)
throw 'weird - this should never be undefined';
else
console.log(value);
}
在上面的示例中,迭代database
对象的属性的正确方法是什么?
解决方法
该问题与for in
循环中的类型检查有关。详细信息在here中。这导致左侧为字符串或任何类型。需要使用一种替代方法,如下所示:
const enum ParametricTable {
A = 'a',B = 'b'
}
type Database = Record<ParametricTable,number>;
const database :{ [key in ParametricTable ] : number } = {
[ParametricTable.A]: 41,[ParametricTable.B]: 42
};
let parametric_table :keyof typeof database;
for ( parametric_table in database) { // note that there is no let here
const value: number = database[parametric_table]; // no implicity any errors.
if (value===undefined)
throw 'weird - this should never be undefined';
else
console.log(value);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。