首页 > 解决方案 > 具有通用键的对象的类型定义

问题描述

我想找到如下的类型定义:

const x: Keys<"A"|"B"> = {
 "A": number, // type of value never changes and doesn't need to be generic
 "B": number
};

理想情况下,这种Keys<T>类型的对象需要为 in 的每个类型T都有一个键,并且不能有一个不在 under 的键T。我得到的最接近的是type Keys<T> = { [key in T]: number },但是当使用如下时:

const obj: Keys<"x"|"y"> = { "x": 1, "y": 2 };
obj["x"] // TS compiler fails with below message

元素隐式具有“任何”类型,因为“x”类型的表达式不能用于索引类型“{ x: number; } | { y:数字;}'。类型 '{ a: number; 上不存在属性 'x' } | { b:数字;}'.ts(7053)

我还尝试了几种将泛型类型参数作为数组传递的变体,例如Keys<["key1", "key2"]>,但比我上面的成功要少。

标签: typescripttypescript-typingstypescript-generics

解决方案


像这样的东西可以解决问题,一个接收键并将值键入为数字的对象:

type Keys<K extends string> = Record<K, number>;

const obj: Keys<"x"|"y"> = { "x": 1, "y": 2 };

推荐阅读