export function isFunctionType()

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;
}