TypeScript声称Function不是Calalble



无论出于何种原因,TypeScript都没有检测到实例Function的某些内容不可调用。

type Constructable = { new(...args: any[]): any }
function isClass(func: any) {
return (
typeof func === 'function' &&
/^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)

https://www.typescriptlang.org/play?ssl=14&ssc=11&pln=14&pc=6#代码/C4TwDgpgBAwg9gOwM7AE4FcDGwCGAjAG2gF4oBvKBCAdwAoA6RnAcquyQC4ocEQBtAXQCUnbicgBfAFCSAZugTYAloiiKkMAjiRJachSJ6DykqFFQRg6VAii0TpqKEhwZUPzijEvUAOTvgyg+UABkIfamApQAepia2gA6SJH0wBAotABi8kqI9GCocMBF4BCpcADKaIoILPSYOAQEujmCgvptUrI5ASqYcBComBAA8lS0ACY4uAYgADR uCJzZCr02AD6wiCgY2PhERmT2iq60ahpaojIIbcYOUP3IwA-baFjFqJ6LXEhbT7u4QgQCJmCxWGxUagvf7vOCoSbTHDtZiKAQAhIaBHe7mSzWRYIiSKRAA

关于如何解决这个问题有什么想法吗?

类型保护isClass需要谓词返回类型:: func is Constructable

type Constructable = { new(...args: any[]): any }
function isClass(func: any): func is Constructable {
return (
typeof func === 'function' &&
/^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))

https://www.typescriptlang.org/play?#code/C4TwDgpgBAwg9gOwM7AE4FcDGwCGAjAG2gF4oBvKBCAdwAoA6RnVAcyQC4ocEQBtAXQCUnbiCgBfAFCSAZugTYAloiiKkMAjiRJachSJ7CoezKqSxEKDNnxFykqFFQRg6VAii0HjqKEhwZY3lTYlCoAHITYGUEcKgAMnjvRwB6AD1MTW0AHSQU+mAIFFoAMWDoxHowVDhgWvAIArgAZTRFBBZ6TBwCAl1gwUFvIalZcpioTDgIVEWIAHkqWgATHFwDEAAYwROMOUKjwAfC2Q0LFxCCEF7R0VA2jUNLR0ZBEHbnymzyctz7DgqCgpDeXHM8DO1kuRGSThcbg8VGov0hF0BKzWOCGjnEUAgBCQ0DIsOcrncOwXgGxEkko2+SDgRHoBDgLFoUxmc0WEFo4WogIA1khwtt6YzGiyWINJEA