gpt4 book ai didi

typescript - 我可以在 Typescript 中使用泛型类型作为对象索引类型吗?

转载 作者:行者123 更新时间:2023-12-04 08:10:49 26 4
gpt4 key购买 nike

我有一个类似于以下的用例:



type StringKeysOf<T> = [{
[K in keyof T]-?: T[K] extends string ? K : never
}[keyof T]];

const createDictionary = <T>(key: StringKeysOf<T>) => {

let dictionary: { [key: string]: T } = {};

const addToDictionary = (value: T) => {
dictionary = { ...dictionary, [value[key]]: value }
}

return { dictionary, addToDictionary }
}


尝试将键属性用作索引类型时,TypeScript 会发出以下消息: Type 'StringKeysOf<T>' cannot be used as an index type.我认为这是不可能的,因为 T最终可能持有一个没有任何类型 string 属性的类型。 (我正在过滤 StringKeysOf 条件类型)。
有谁知道是否有办法使这种实现成为可能?

最佳答案

您可以采取一些措施来解决此问题。首先要注意StringKeysOf<T>Array类型。鉴于名称 key而不是 keys ,我假设你的意思是参数是一个单一的值。您需要删除 [] :

type StringKeysOf<T> = {
[K in keyof T]-?: T[K] extends string ? K : never
}[keyof T];
然后,您需要确保您的 T具有您期望的形状:
T extends { [K in keyof T]: any }
放在一起: TS Playground
type StringKeysOf<T> = {
[K in keyof T]-?: T[K] extends string ? K : never
}[keyof T];

const createDictionary = <T extends { [K in keyof T]: any }>(key: StringKeysOf<T>) => {

let dictionary: { [key: string]: T } = {};

const addToDictionary = (value: T) => {
dictionary = { ...dictionary, [value[key]]: value }
}

return { dictionary, addToDictionary }
}

关于typescript - 我可以在 Typescript 中使用泛型类型作为对象索引类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65970304/

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