Заставить объект иметь хотя бы один ключ (Object.keys (o) .length> 0) - PullRequest
0 голосов
/ 04 сентября 2018

Скажите, у меня есть этот объект

export interface Name {
   [key: string]: boolean
}

const v = <Name>{};

как мне предотвратить это от компиляции? Я хочу заставить v иметь хотя бы одно свойство:

const v = <Name>{foo: true};

1 Ответ

0 голосов
/ 21 мая 2019

Вы не можете сделать это для переменной. Для начала вы не можете одновременно определить тип переменной и добавить к ней аннотацию. И по умолчанию любая добавляемая вами аннотация не может ограничить существование хотя бы одного произвольного свойства.

Если у вас есть функция и вы хотите, чтобы у параметра функции было хотя бы одно свойство, мы можем использовать условный тип для генерации чего-то похожего на пользовательскую ошибку:

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: ""})
...