如何在打字稿中“固定”钥匙的同时在对象内实施类型?

时间:2019-04-03 20:09:31

标签: 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' }
  …
}

但是在这种情况下,打字稿说索引签名应该是字符串还是数字?

1 个答案:

答案 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' },
})