【发布时间】:2022-06-22 17:56:30
【问题描述】:
假设有一个简单的对象类型X,以及一个创建显式类型数组XcreateXList的函数,如下所示:
type X = Readonly<{
a: string
b: string
}>
type XList = Readonly<X[]>
// TS workaround to create an explicitly-typed X
const createXList = <TXList extends XList>(xList: TXList): TXList => xList
*/
然后可以创建X 的显式类型数组,例如xList,如下所示:
const xList = createXList([
{ a: 'foo', b: 'bar' },
{ a: 'fizz', b: 'buzz' },
] as const)
/*
const xList: readonly [{
readonly a: "foo";
readonly b: "bar";
}, {
readonly a: "fizz";
readonly b: "buzz";
}]
问题是:如何为字典创建一个类型,其中每个键是a 和b 属性的串联,而值只是用于创建每个键的数组的值在字典中,同时仍保持显式键入。例如:
type XListToXDict<T extends XList> = { /* some magic */ }
type Test = XListToXDict<typeof xList>
/*
{
"foobar": { a: "foo", b: "bar" };
"fizzbuzz": { a: "fizz", b: "buzz" };
}
*/
因此,例如,为特定 X 创建密钥的类型是:
type XToKey<T extends X> = `${T['a']}${T['b']}`
注意事项:
人们会假设可以执行以下操作以至少提取字典的键(使用上面的XToKey):
type XListToKeys<T extends XList> = XToKey<T[number]>
但这会失败,因为它会生成a 和b 的所有可能组合(在xList 的特定情况下,即"foobar" | "foobuzz" | "fizzbar" | "fizzbuzz")。
然后是从数组中为字典中的每个值选择特定项目的挑战。
【问题讨论】:
标签: typescript