#typescript
#typescript
Вопрос:
По какой-либо причине TypeScript не обнаруживает, что какая-либо функция экземпляра недоступна для вызова.
type Constructable = { new(...args: any[]): any }
function isClass(func: any) {
return (
typeof func === 'function' amp;amp;
/^classs/.test(Function.prototype.toString.call(func))
)
}
function coerceOne(data: any, fn: Function | Constructable) {
if (isClass(fn)) {
const constructor = fn as Constructable
return new constructor(data)
} else {
return fn(data) // <-- ERROR
}
}
Ошибка:
This expression is not callable.
No constituent of type 'Function | Constructable' is callable.(2349)
Есть идеи о том, как это решить?
Комментарии:
1. Вы проверяете, не должно ли
func === 'function'
быть не равно?2. Классы в JavaScript являются функциями, так что да, эта проверка обязательна.
Ответ №1:
Для защиты типа isClass
требуется возвращаемый тип предиката: : func is Constructable
type Constructable = { new(...args: any[]): any }
function isClass(func: any): func is Constructable {
return (
typeof func === 'function' amp;amp;
/^classs/.test(Function.prototype.toString.call(func))
)
}
function coerceOne(data: any, fn: Function | Constructable) {
if (isClass(fn)) {
const constructor = fn as Constructable
return new constructor(data)
} else {
return fn(data)
}
}
console.log(coerceOne('works', console.log))