Не существует идеального способа ссылки на тип, такой как «объект, который не является функцией», поскольку для этого потребуются истинные типы вычитания , и этого не существует в 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
на более сложный и исключить меньшее количество нефункциональных функций, но, скорее всего, всегда будет что-то, что определение будет неверным.Вам решать как далеко вы хотите пойти .
Надеюсь, это поможет.Удачи!