gpt4 book ai didi

typescript - 字典函数的正确返回类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:20 29 4
gpt4 key购买 nike

我有这个简单的功能:

export function toDictionary<T>(items: T[], getKey: (item: T) => string) {
const result = [...items];

for (const item of items) {
const key = getKey(item);
if(result[key]) {
throw new Error(`Key value ${key} is not unique.`);
}
result[key] = item;
}

return result;
}

我想以智能感知向我显示属性的方式指定此函数的返回类型。

例子:

const dictionary = toDictionary([{
type: 'list',
url: 'http://example/list'
}, {
type: 'details',
url: 'http://example/{0}/details'
}], x => x.type);

Typescript 应该知道 dictionary.listdictionary.details 存在。

这有可能吗?我愿意更改此实现代码中的任何内容。所有数据在构建时都是可用的,即它是静态的、硬编码的数据。

最佳答案

第一个问题是让编译器推断属性的文字类型,这些属性最终可能被用作字典的键。如果文字被分配到一个位置,该位置扩展了可以缩小为文字的类型的泛型类型参数,则编译器将推断文字类型。

所以在我们的例子中,如果我们使用这个约束,我们将得到 type 的文字类型: T extends Record<string, P | object>, P extends PropertyKey .

如果我们还为 getKey 的返回类型添加一个类型参数函数(假设 K )我们可以将结果键入 T[] & Record<K, T> .

把它放在一起我们得到:

export function toDictionary<T extends Record<string, P | object>, P extends PropertyKey, K extends Extract<T[keyof T], PropertyKey>>(items: T[], getKey: (item: T) => K): T[] & Record<K, T> {
const result = [...items];

for (const item of items) {
result[getKey(item) as number] = item;
}

return result as T[] & Record<K, T>;
}

const dictionary = toDictionary([{
type: 'list',
o: { data: "" },
url: 'http://example/list'
}, {
type: 'details',
o: { data: "" }, // just to show we can nest objects
url: 'http://example/{0}/details'
}], x => x.type);

dictionary.details.url // ok

现在这样做的缺点是将为所有属性推断文字类型,包括 url例如(以及任何其他 stringnumber 属性)。这可能会让人分心。

关于typescript - 字典函数的正确返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54088803/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com