10000 Inherit construct signature for extended interface · nycdotnet/TypeScript@8045302 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8045302< 10000 /span>

Browse files
committed
Inherit construct signature for extended interface
1 parent 90391fe commit 8045302

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2938,8 +2938,8 @@ namespace ts {
29382938
return type.resolvedBaseConstructorType;
29392939
}
29402940

2941-
function hasClassBaseType(type: InterfaceType): boolean {
2942-
return !!forEach(getBaseTypes(type), t => !!(t.symbol.flags & SymbolFlags.Class));
2941+
function hasClassOrInterfaceBaseType(type: InterfaceType): boolean {
2942+
return !!forEach(getBaseTypes(type), t => !!(t.symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)));
29432943
}
29442944

29452945
function getBaseTypes(type: InterfaceType): ObjectType[] {
@@ -3375,11 +3375,14 @@ namespace ts {
33753375
}
33763376

33773377
function getDefaultConstructSignatures(classType: InterfaceType): Signature[] {
3378-
if (!hasClassBaseType(classType)) {
3378+
if (!hasClassOrInterfaceBaseType(classType)) {
33793379
return [createSignature(undefined, classType.localTypeParameters, emptyArray, classType, undefined, 0, /*hasRestParameter*/ false, /*hasStringLiterals*/ false)];
33803380
}
33813381
const baseConstructorType = getBaseConstructorTypeOfClass(classType);
33823382
const baseSignatures = getSignaturesOfType(baseConstructorType, SignatureKind.Construct);
3383+
if(baseSignatures.length === 0) {
3384+
return [createSignature(undefined, classType.localTypeParameters, emptyArray, classType, undefined, 0, /*hasRestParameter*/ false, /*hasStringLiterals*/ false)];
3385+
}
33833386
const baseTypeNode = getBaseTypeNodeOfClass(classType);
33843387
const typeArguments = map(baseTypeNode.typeArguments, getTypeFromTypeNode);
33853388
const typeArgCount = typeArguments ? typeArguments.length : 0;
@@ -3597,16 +3600,17 @@ namespace ts {
35973600
return <ResolvedType>type;
35983601
}
35993602

3600-
// Return properties of an object type or an empty array for other types
3603+
3604+
/** Return properties of an object type or an empty array for other types */
36013605
function getPropertiesOfObjectType(type: Type): Symbol[] {
36023606
if (type.flags & TypeFlags.ObjectType) {
36033607
return resolveStructuredTypeMembers(<ObjectType>type).properties;
36043608
}
36053609
return emptyArray;
36063610
}
36073611

3608-
// If the given type is an object type and that type has a property by the given name,
3609-
// return the symbol for that property.Otherwise return undefined.
3612+
/** If the given type is an object type and that type has a property by the given name,
3613+
* return the symbol for that property. Otherwise return undefined. */
36103614
function getPropertyOfObjectType(type: Type, name: string): Symbol {
36113615
if (type.flags & TypeFlags.ObjectType) {
36123616
const resolved = resolveStructuredTypeMembers(<ObjectType>type);

0 commit comments

Comments
 (0)
0