我要输入的项目中有一个对象:
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' }
…
}
但是在这种情况下,打字稿说索引签名应该是字符串还是数字?
答案 0 :(得分:1)
如果知道键,则可以使用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' },
})