gpt4 book ai didi

typescript - 如何在TypeScript中使用一个不同的键声明对象的类型

转载 作者:行者123 更新时间:2023-12-03 21:41:39 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





TypeScript mapped types: Flag type with nesting

(1 个回答)


6 个月前关闭。




你好,我想为这样的对象创建一个类型:

const z = {
name: { // this one is special
buty: ['qqqq']
},
lipa: ['xxx'],
// more keys here
};

Bacially 它是这样的对象
type Test = {
[key: string]: string[]
}
除了一个小异常(exception)。它总是有一个值略有不同的键名。
type Special = {
name: {
[key: string]: string[]
}
}
但是当我尝试合并这两种类型时
type Test =
{ [key: string]: string[] } &
{ name: { [key: string]: string[] } };

const z: Test = {
name: { // this one is special
buty: ['qqqq']
},
lipa: ['xxx'],
// more keys here
};
我收到一个错误 Type '{ buty: string[]; }' is missing the following properties from type 'string[]': length, pop, push, concat, and 26 more.(2322) .
是否可以为这样的对象创建类型?
TypeScript Playgroud

最佳答案

以下基于映射类型的解决方案:

type Test<T extends  { [key: string]: any }> =
{
[K in keyof T]:
K extends 'name' ? { [key: string]: string[] } : string[]
}

// id function to make type more accurate by generic
const makeTest = <T extends { [key: string]: any }>(obj: Test<T>): Test<T> => obj


// correct use
const z = makeTest({
name: { // this one is special
buty: ['qqqq']
},
lipa: ['xxx'],
// more keys here
});

// error as object wrong
const y = makeTest({
name: ['xxx'], // no it is special
lipa: ['xxx'],
// more keys here
});
我们可以通过使用 id 函数 (x => x) 来实现需求,这将由于使用泛型类型而缩小类型。当我们使用泛型时,TS 有更好的缩小范围,而正是这个功能允许我们这样做。此外,您制作的类型无法正常工作,因为 string | 'name'键计算为 string因此完全省略了交叉点的第二部分。
解决方案是使类型有条件,并为特殊的“名称”键设置不同的值类型。
playground

关于typescript - 如何在TypeScript中使用一个不同的键声明对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67210814/

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