gpt4 book ai didi

typescript :声明对象上的所有属性必须属于同一类型

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

在 Typescript 中,您可以声明数组中的所有元素都属于同一类型,如下所示:

const theArray: MyInterface[]

您是否可以做类似的事情来声明一个对象的所有属性值必须属于同一类型? (不指定每个属性名称)

例如,我目前正在这样做:

interface MyInterface {
name:string;
}

const allTheThingsCurrently = {
first: <MyInterface>{name: 'first thing name' },
second: <MyInterface>{name: 'second thing name' },
third: <MyInterface>{name: 'third thing name' },
//...
};

...请注意我必须如何指定 <MyInterface>对于每一个属性(property)。有什么捷径吗?也就是说,我正在想象这样的事情......

const allTheThingsWanted:MyInterface{} = {
first: {name: 'first thing name' },
second: {name: 'second thing name' },
third: {name: 'third thing name' },
//...
};

MyInterface{}是无效代码的部分,我正在寻找一种方法来减少冗余,并且可以选择额外的严格性来防止将任何其他属性添加到不同类型的对象。

最佳答案

解决方案 1:Indexable type

interface Thing {
name: string
}

interface ThingMap {
[thingName: string]: Thing
}

const allTheThings: ThingMap = {
first: { name: "first thing name" },
second: { name: "second thing name" },
third: { name: "third thing name" },
}

这里的缺点是您可以访问 allTheThings 的任何属性而不会出现任何错误:

allTheThings.nonexistent // type is Thing

通过将 ThingMap 定义为 [thingName: string]: Thing | 可以使这更安全void,但这将需要在所有地方进行空值检查,即使您正在访问您知道存在的属性也是如此。

解决方案 2:具有空操作函数的泛型

const createThings = <M extends ThingMap>(things: M) => things

const allTheThings = createThings({
first: { name: "first thing name" },
second: { name: "second thing name" },
third: { name: "third thing name" },
fourth: { oops: 'lol!' }, // error here
})

allTheThings.first
allTheThings.nonexistent // comment out "fourth" above, error here

createThings 函数有一个通用的 MM 可以是任何东西,只要所有的值都是 Thing ,然后它返回 M。当您传入一个对象时,它会根据 extends 之后的类型验证该对象,同时返回与您传入的对象相同的形状。

这是“最聪明”的解决方案,但实际上使用了一些看起来很聪明的 hack 来让它工作。无论如何,在 TS 添加更好的模式来支持这种情况之前,这将是我的首选路线。

关于 typescript :声明对象上的所有属性必须属于同一类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51237668/

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