【发布时间】:2021-11-09 23:25:40
【问题描述】:
我有一个这样的对象 (demo in ts playground):
const sites = {
stack: {url: 'https://stackoverflow.com/'},
google: {url: 'https://www.google.com/'},
azure: {url: 'https://portal.azure.com/'}
} as const
我想做的是创建一个包含所有使用过的键的联合类型,我可以这样做:
type SiteNames = keyof typeof sites; // "stack" | "google" | "azure"
但是,我还想将安全类型添加到 sites 初始化中,其中所有对象值都是这样的特定类型 (demo in ts playground):
interface ISiteDetails {
url: string;
}
const sites: Record<string, ISiteDetails> = {
stackoverflow: {url: 'https://stackoverflow.com/'},
google: {url: 'https://www.google.com/'},
azure: {url: 'https://portal.azure.com/'}
} as const
这会在创建 sites 时提供一些类型检查,但也会从最终类型中删除 const assertion,所以现在 SiteNames 只是解析为字符串:
type SiteNames = keyof typeof sites; // string
问题:有什么办法可以兼得?创建 Record<any, ISiteDetails 时的强类型化以及将所有对象键提取到新联合类型的能力?
解决方法:不符合人体工程学,但我可以通过将站点重新分配给这样的导出变量来添加最后一层类型检查 (demo in ts playground):
const SitesTyped: Record<SiteNames, ISiteDetails> = sites;
【问题讨论】:
标签: typescript keyof