typescript - 如何在打字稿中“固定”键的同时强制对象内的类型?
问题描述
我正在尝试键入的项目中有一个对象:
export const dateFormat = {
hourOnly: { hour: 'numeric' }
…
}
我知道这个对象中的值应该适合Intl.DateTimeFormatOptions
所以我尝试了:
export const dateFormat: {[key: string]: Intl.DateTimeFormatOptions} = {
hourOnly: { hour: 'numeric' }
…
}
这可行,但我无法在项目的其他地方自动完成该对象。我尝试as const
在最后添加,但这没有帮助。
有没有办法在仍然自动完成键的同时强制执行对象值?
我也试过:
type dateFormatOptions = 'hourOnly'
export const dateFormat: {[key: dateFormatOptions]: Intl.DateTimeFormatOptions} = {
hourOnly: { hour: 'numeric' }
…
}
但在这种情况下,打字稿说索引签名应该是字符串还是数字?
解决方案
如果您知道键,则可以Record
用来创建具有所需类型的显式键的类型(Record
称为映射类型)
type dateFormatOptions = 'hourOnly'
export const dateFormat: Record<dateFormatOptions, Intl.DateTimeFormatOptions> = {
hourOnly: { hour: 'numeric' }
}
这确实需要您将属性的名称保存在两个地方。另一种选择是使用具有受约束的泛型类型参数的函数。类型参数约束将保留指定类型的所有值,但将根据您传入的对象推断实际键。
function createDateFormatOptions<K extends PropertyKey>(o: Record<K, Intl.DateTimeFormatOptions>): Record<K, Intl.DateTimeFormatOptions> {
return o;
}
export const dateFormat = createDateFormatOptions({
hourOnly: { hour: 'numeric' },
})
推荐阅读
- c++ - 用于嵌套可变参数模板类的 C++ 模糊模板实例化
- php - Square API 对象创建
- python - 如何在数据框中每天的特定时间操作数据框列中的值
- python - 如何在数据框的列中使用字典来访问该列的值并取另一列的平均值?
- python - 如何根据条件附加具有两种不同大小的数组的列表
- python - 如何在每个带有请求的线程上获取不同的代理?
- kubernetes-helm - 是否可以从文件中的 helm 创建 yaml 对象
- c# - 让元素假装它不存在但仍然可见 WPF
- javascript - 如何在 jquery 或 c# 中为电子商务网站过滤器生成动态 URL
- python - 如何在视频上正确运行 Detectron2?