首页 > 解决方案 > 如何在打字稿中“固定”键的同时强制对象内的类型?

问题描述

我正在尝试键入的项目中有一个对象:

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' }
  …
}

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

标签: typescript

解决方案


如果您知道键,则可以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' },
})

推荐阅读