in lib/base.ts [157:196]
export function isFunctionType(type: ts.TypeNode, tc: ts.TypeChecker): boolean {
if (ts.isFunctionTypeNode(type)) return true;
if (ts.isTypeReferenceNode(type)) {
let t = tc.getTypeAtLocation(type);
if (t.symbol && t.symbol.flags & ts.SymbolFlags.Function) return true;
}
if (ts.isIntersectionTypeNode(type)) {
let types = type.types;
for (let i = 0; i < types.length; ++i) {
if (isFunctionType(types[i], tc)) {
return true;
}
}
return false;
}
if (ts.isUnionTypeNode(type)) {
let types = type.types;
for (let i = 0; i < types.length; ++i) {
if (!isFunctionType(types[i], tc)) {
return false;
}
}
return true;
}
// Warning: if the kind is a reference type and the reference is to an
// interface that only has a call member we will not return that it is a
// function type.
if (ts.isTypeLiteralNode(type)) {
let members = type.members;
for (let i = 0; i < members.length; ++i) {
if (ts.isCallSignatureDeclaration(members[i])) {
return false;
}
}
return true;
}
return false;
}