typescript - 具有通用键的对象的类型定义
问题描述
我想找到如下的类型定义:
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"]>
,但比我上面的成功要少。
解决方案
像这样的东西可以解决问题,一个接收键并将值键入为数字的对象:
type Keys<K extends string> = Record<K, number>;
const obj: Keys<"x"|"y"> = { "x": 1, "y": 2 };
推荐阅读
- python - 为什么更新时套索错误增加?(+评价)
- loops - 在 Ansible 中构建循环
- javascript - 如何引用数组元素作为 .backgroundImage 的目标?
- flutter - 一个接一个地为相同类型的小部件设置动画的更好方法?
- amazon-web-services - 上传文件或发送电子邮件 aws 时出现身份验证错误
- list - Flutter:将列表从一页传递到另一页
- xamarin - 如何从 GenericRepository 调用 MessagingCenter.Send
- java - 将现有的 gradle 项目导入 intelli J idea
- django - 如何对我的另一个视图进行 API 调用?
- stm32 - NUCLEO-STM32F401RE 板上的 ADC 在输入信号超过 10kHz 时无法工作