打字稿:声明对象上的所有属性必须具有相同的类型

拉瓦奇

在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>为每个属性指定的内容。有什么捷径吗?即我在想像这样的事情...

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

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

金达罗

解决方案1:可索引类型

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函数具有泛型M,并且M可以是任意值,只要所有值均为Thing,就可以返回M当您传递对象时,它将针对后面的类型验证该对象extends,同时返回与您传递的对象相同的形状。

这是“最智能”的解决方案,但使用看上去有些聪明的hack使其真正起作用。无论如何,在TS添加更好的模式来支持此类情况之前,这将是我的首选路线。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类实现打字稿错误“类型具有私有属性的单独声明”

打字稿具有相同的派生类型,但所有可选键

打字稿:如何声明具有从 IIFE 返回的自定义属性的函数的类型

后续属性声明必须具有相同的类型。属性字符串应为()=> string类型

打字稿-检查对象是否具有所有接口属性

“ WeakMap”的所有声明必须具有相同的类型参数

打字稿中所有对象文字类型的子类型?

打字稿:允许通用类型仅是具有“字符串”属性的对象

Vue2具有打字稿,类型上不存在属性

打字稿打字:具有属性的函数

打字稿:从类型中排除所有必需的属性

具有隐式属性类型的通用打字稿

打字稿从嵌套对象中获取属性的所有值

打字稿创建具有嵌套属性的地图对象

打字稿:从枚举值生成具有映射属性的对象

打字稿:输入具有动态属性的对象

具有未知属性的打字稿非空对象

打字稿:对象具有不同的键,相同的类型 - 如何避免在界面中重新定义整个对象?

打字稿:如何从 2 组不同的对象中获取具有相同属性值但键不同的对象

Angular 新手:调试 Typescript 错误“'imageLoader' 的所有声明必须具有相同的类型参数”

打字稿:具有属性的函数

打字稿:具有属性的函数

打字稿是否具有自动属性?

打字稿:具有单个键的对象

JSDoc是一个对象,所有属性(无论名称如何)都具有相同的类型

具有相同键和相似值的两种类型的打字稿类型

我该如何解决该错误后续属性声明必须具有相同的类型。角度9

打字稿:比较作为接口类型的对象是否等于另一个对象具有相同的接口类型

打字稿:使用所有声明获取函数的类型参数