gpt4 book ai didi

typescript - 如何将对象键的值映射到 TypeScript 中的同一对象?

转载 作者:行者123 更新时间:2023-12-04 00:53:52 24 4
gpt4 key购买 nike

我如何才能将对象键的值映射到 TypeScript 中的同一对象,以便 IntelliSense 知道如何工作,如下例所示?

const obj = getByName([
{ __name: 'foo', baz: 'foobar' },
{ __name: 'bar', qux: 'quux' },
]);

obj.foo.__name // ok
obj.foo.baz // ok
obj.foo.quuz // not ok

obj.bar.__name // ok
obj.bar.qux // ok
obj.bar.quuz // not ok

最佳答案

您可以使用以下内容:

export function getByName<
TName extends string,
TObj extends {__name: TName},
>(arr: TObj[]): Record<TName, TObj> {
return arr.reduce((acc, obj) => {
return {
...acc,
[obj.__name]: obj,
};
}, {} as Partial<Record<TName, TObj>>) as Record<TName, TObj>;
}

typescript playground

编辑:上面的解决方案有两个问题:

  1. 生成的对象具有任何字符串的键(意味着obj.nonExistingKey.qux将通过)
  2. 尽管提供的数组中没有 {__name: 'foo', qux: 'value'},但它认为 obj.foo.qux 没问题。

要解决第一个问题,我们可以将数组作为常量传递:

function getByName<TObj extends {__name: string}>(arr: readonly TObj[]) {
return arr.reduce((acc, obj) => {
return {
...acc,
[obj.__name]: obj,
};
}, {}) as Record<TObj['__name'], TObj>;
}

const obj = getByName([
{ __name: 'foo', baz: 'foobar' },
{ __name: 'bar', qux: 'quux' },
] as const);

obj.nonExistingKey.quuz // not ok NOW!

typescript playground

但是,我不知道针对泛型问题 2 的解决方案。如果它对你来说真的很重要,你可以实现some type guards .

关于typescript - 如何将对象键的值映射到 TypeScript 中的同一对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64296404/

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