我有一个对象(让它被冻结,这样typescript可以更好地处理它的键):
const obj = Object.freeze({
'hello': 64,
'world': 20
}) as {[key: string]: number};
现在我有一个函数,用户可以通过键选择值:
const pick = (keys: Array<string>): Array<number> => {
const values = [];
for (const key of keys) {
// Check if object contains property-key
if (!(key in obj)) {
throw new Error(`There's no such key: ${key}`);
}
values.push(obj[key]);
}
return values;
};
到目前为止,看起来一切都很好,并且在运行时无缝运作,我会检查用户是否传递了任何无效的键。但是我如何告诉TS只能使用obj
中的键?
我可以使用Array<'hello' | 'world'>
,但每次添加obj
的新属性时都需要更新它,这有点麻烦。
相关问题,但它们似乎都使用类型,而我只有一个对象(如果有帮助,它可以被冻结):
- 创建以类型键为基础的对象联合类型(他得到了一个类型,我只有一个对象)
- 按对象值的类型过滤并获取对象键的联合类型(基本上与1.相同,但他想要
type
,而我正在尝试从我的对象中构建类型) - 获取TypeScript联合对象的键(看起来不错,但他也有一个类型...)