强制对象至少有一个键( Object.keys(o).length > 0 )

Posted

技术标签:

【中文标题】强制对象至少有一个键( Object.keys(o).length > 0 )【英文标题】:Force object to have at least one key ( Object.keys(o).length > 0 ) 【发布时间】:2019-02-09 22:29:34 【问题描述】:

假设我有这个对象

export interface Name 
   [key: string]: boolean


const v = <Name>;

如何防止它编译?我想要做的是强制v 至少拥有一个属性:

const v = <Name>foo: true;

【问题讨论】:

我认为这不可能。如果您对您的方案多说一些,我们可能会有更多的想法。 您应该添加更多详细信息。这在抽象上是不可能的,但在某些情况下是可能的。 【参考方案1】:

您不能对变量执行此操作。首先,您不能同时推断变量的类型并为其添加注释。默认情况下,您添加的任何注释都不能限制至少一个任意属性的存在。

如果你有一个函数,并且你想确保一个函数参数至少有一个属性,我们可以使用条件类型来生成类似于自定义错误的东西:

function noEmpty<T>(o: T & (keyof T extends never ? "No empty object" : )) 



noEmpty() // err Argument of type '' is not assignable to parameter of type ' & "No empty object"'.
noEmpty( a: "")

【讨论】:

期待github.com/Microsoft/TypeScript/pull/29317 可以让解决方案更干净 @Yozi 是的,这会有所帮助,但它已被推迟,所以我不知道它何时可用..

以上是关于强制对象至少有一个键( Object.keys(o).length > 0 )的主要内容,如果未能解决你的问题,请参考以下文章

Object.keys() 从集合中返回 MongoDB 对象上的意外键 [重复]

javascript 使用Object.keys()生成所有对象键的数组

Typescript:至少有一个T类型属性的对象。

Object.keys方法详解

3.Object.keys() 取得对象中所有可枚举的属性

Vue Keys 不会从 Object 中删除