Как объявить тип в TypeScript, который включает только объекты, а не функции - PullRequest
0 голосов
/ 07 октября 2018

Можно ли как-то в TypeScript определить тип так, чтобы он включал только объекты, но не функции?

Пример:

type T = { [name: string]: any } // How to modify this to only accepts objects???

const t: T = () => {} // <- This should not work after modification

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 октября 2018

Не существует идеального способа ссылки на тип, такой как «объект, который не является функцией», поскольку для этого потребуются истинные типы вычитания , и этого не существует в TypeScript (по состоянию на 3.1 вминимум).

Один из достаточно простых решений - посмотреть на Function интерфейс и описать что-то, что определенно не a Function, но котороесоответствует большинству нефункциональных объектов, с которыми вы можете столкнуться.Пример:

type NotAFunction = { [k: string]: unknown } & ({ bind?: never } | { call?: never });

Это означает «объект с некоторыми неопределенными ключами, в котором отсутствует свойство bind или свойство call».Давайте посмотрим, как он себя ведет:

const okayObject: NotAFunction = { a: "hey", b: 2, c: true };
const notOkayObject: NotAFunction = () => {}; // error, call is not undefined

Хорошо.

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

const surprisinglyNotOkay: NotAFunction = { 
  publication: "magazine", 
  bind: "staples",
  call: "867-5309",
  fax: null
}; // error, call is not undefined

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

Надеюсь, это поможет.Удачи!

...