【发布时间】:2019-07-21 06:22:34
【问题描述】:
我想使用 Map 而不是 object map 来声明一些键和值。但是 Typescript 似乎不支持 ES6 Map 的索引类型,是否正确,是否有任何解决方法?
此外,我还想让值类型安全,以便映射中的每个条目都具有与键对应的值的正确类型。
这里有一些伪代码描述了我想要实现的目标:
type Keys = 'key1' | 'key2';
type Values = {
'key1': string;
'key2': number;
}
/** Should display missing entry error */
const myMap = new Map<K in Keys, Values[K]>([
['key1', 'error missing key'],
]);
/** Should display wrong value type error for 'key2' */
const myMap = new Map<K in Keys, Values[K]>([
['key1', 'okay'],
['key2', 'error: this value should be number'],
]);
/** Should pass */
const myMap = new Map<K in Keys, Values[K]>([
['key1', 'all good'],
['key2', 42],
]);
编辑:更多部分描述我的用例的代码
enum Types = {
ADD = 'ADD',
REMOVE = 'REMOVE',
};
/** I would like type-safety and autocompletion for the payload parameter */
const handleAdd = (state, payload) => ({...state, payload});
/** I would like to ensure that all types declared in Types are implemented */
export const reducers = new Map([
[Types.ADD, handleAdd],
[Types.REMOVE, handleRemove]
]);
【问题讨论】:
-
Map并没有真正以这种方式输入以使这项工作适合您。您需要提出自己的自定义类型interface MyMap {...}和interface MyMapConstructor {...},它们可能是也可能不是Map和MapConstructor的实际子类型。对于一些工作量太大了,当你完成所有工作后,它会为你提供与Values类型相同的功能。你需要多少这个? -
编辑:在原始帖子中添加了更多代码。我更喜欢上面的结构而不是对象,因为我正在考虑使用符号作为键,并且因为它看起来更加结构化/严格。
-
第一个例子对我来说似乎不是错误
-
正确的胡安,我的第一个用例实际上已经解决了。我还考虑过将这些键、值声明为具有严格类型检查的数组,然后对 Maps 进行不那么严格的类型检查,但我不确定它是否会起作用。
标签: typescript ecmascript-6 typescript-generics union-types es6-map