【发布时间】:2019-10-12 05:00:49
【问题描述】:
我有一个对象,其中包含一些用于我的应用程序的预定义数据,这些数据存储在 const 变量中,如下所示:
const data:{[key:string]:any} =Object.freeze({
some: 123,
long: {"a":"b"},
list: ["c"],
of: "",
arbitrary: null,
things: 1.2,
});
该对象的键对应用程序的其余部分是已知的。考虑这个访问数据对象的函数:
function doWork(k) {
if(!data.hasOwnProperty(k)) throw Error();
let value = data[k];
//...
}
这是用类似的字符串调用的
doWork("things");
我想用 Typescript 编译时检查替换无效键的运行时错误。我希望能够写作
function doWork(k: keyof data) {
let value = data[k];
//...
}
但显然keyof 运算符不是这样工作的。我收到一个错误TS2304: Cannot find name 'data'.
我的解决方法: 我可以像这样提取对象的键:
console.log("\""+Object.keys(data).join("\"|\"")+"\"");
然后我可以复制/粘贴并定义为类型。
type data_key = "some"|"long"|"list"|"of"|"arbitrary"|"things"
export function doWork(k:data_key) {
let value = data[k];
//...
}
这感觉像是一个愚蠢的 hack,而且每当我必须进行更改时都非常不方便,因为我必须记住将这个语句放在正确的位置,运行程序,然后手动将值复制回源代码代码(或者实际上,只需自己输入更改即可)。
我愿意接受更好的解决方案。是否有提供我正在寻找的功能的语言功能?
【问题讨论】:
标签: typescript