Skip to content

Commit 5b0d86d

Browse files
committed
add signature and union type check
1 parent 07c4fcf commit 5b0d86d

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/services/completions.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1140,13 +1140,23 @@ namespace ts.Completions {
11401140
case SyntaxKind.MethodSignature:
11411141
case SyntaxKind.MethodDeclaration: {
11421142
const signatures = checker.getSignaturesOfType(type, SignatureKind.Call);
1143-
if (signatures.length > 1) {
1143+
if (signatures.length !== 1) {
11441144
// We don't support overloads in object literals.
11451145
return undefined;
11461146
}
1147-
const effectiveType = type.flags & TypeFlags.Union && (type as UnionType).types.length < 10
1147+
let effectiveType = type.flags & TypeFlags.Union && (type as UnionType).types.length < 10
11481148
? checker.getUnionType((type as UnionType).types, UnionReduction.Subtype)
11491149
: type;
1150+
if (effectiveType.flags & TypeFlags.Union) {
1151+
// Only offer the completion if there's a single function type component.
1152+
const functionTypes = filter((effectiveType as UnionType).types, type => checker.getSignaturesOfType(type, SignatureKind.Call).length > 0);
1153+
if (functionTypes.length === 1) {
1154+
effectiveType = functionTypes[0];
1155+
}
1156+
else {
1157+
return undefined;
1158+
}
1159+
}
11501160
let typeNode = checker.typeToTypeNode(effectiveType, enclosingDeclaration, builderFlags, codefix.getNoopSymbolTrackerWithResolver({ program, host }));
11511161
if (!typeNode || !isFunctionTypeNode(typeNode)) {
11521162
return undefined;

0 commit comments

Comments
 (0)