Simplify resolveBaseTypesOfClass (#17918)

This commit is contained in:
Andy 2017-08-21 11:34:53 -07:00 committed by GitHub
parent 07e1d3b13d
commit 2b28916e5e

View file

@ -4929,7 +4929,7 @@ namespace ts {
} }
function resolveBaseTypesOfClass(type: InterfaceType): void { function resolveBaseTypesOfClass(type: InterfaceType): void {
type.resolvedBaseTypes = type.resolvedBaseTypes || emptyArray; type.resolvedBaseTypes = emptyArray;
const baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); const baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type));
if (!(baseConstructorType.flags & (TypeFlags.Object | TypeFlags.Intersection | TypeFlags.Any))) { if (!(baseConstructorType.flags & (TypeFlags.Object | TypeFlags.Intersection | TypeFlags.Any))) {
return; return;
@ -4976,17 +4976,12 @@ namespace ts {
error(baseTypeNode.expression, Diagnostics.Base_constructor_return_type_0_is_not_a_class_or_interface_type, typeToString(baseType)); error(baseTypeNode.expression, Diagnostics.Base_constructor_return_type_0_is_not_a_class_or_interface_type, typeToString(baseType));
return; return;
} }
if (type === baseType || hasBaseType(<BaseType>baseType, type)) { if (type === baseType || hasBaseType(baseType, type)) {
error(valueDecl, Diagnostics.Type_0_recursively_references_itself_as_a_base_type, error(valueDecl, Diagnostics.Type_0_recursively_references_itself_as_a_base_type,
typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.WriteArrayAsGenericType)); typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.WriteArrayAsGenericType));
return; return;
} }
if (type.resolvedBaseTypes === emptyArray) { type.resolvedBaseTypes = [baseType];
type.resolvedBaseTypes = [<ObjectType>baseType];
}
else {
type.resolvedBaseTypes.push(<ObjectType>baseType);
}
} }
function areAllOuterTypeParametersApplied(type: Type): boolean { function areAllOuterTypeParametersApplied(type: Type): boolean {
@ -5003,7 +4998,7 @@ namespace ts {
// A valid base type is `any`, any non-generic object type or intersection of non-generic // A valid base type is `any`, any non-generic object type or intersection of non-generic
// object types. // object types.
function isValidBaseType(type: Type): boolean { function isValidBaseType(type: Type): type is BaseType {
return type.flags & (TypeFlags.Object | TypeFlags.NonPrimitive | TypeFlags.Any) && !isGenericMappedType(type) || return type.flags & (TypeFlags.Object | TypeFlags.NonPrimitive | TypeFlags.Any) && !isGenericMappedType(type) ||
type.flags & TypeFlags.Intersection && !forEach((<IntersectionType>type).types, t => !isValidBaseType(t)); type.flags & TypeFlags.Intersection && !forEach((<IntersectionType>type).types, t => !isValidBaseType(t));
} }
@ -5016,12 +5011,12 @@ namespace ts {
const baseType = getTypeFromTypeNode(node); const baseType = getTypeFromTypeNode(node);
if (baseType !== unknownType) { if (baseType !== unknownType) {
if (isValidBaseType(baseType)) { if (isValidBaseType(baseType)) {
if (type !== baseType && !hasBaseType(<BaseType>baseType, type)) { if (type !== baseType && !hasBaseType(baseType, type)) {
if (type.resolvedBaseTypes === emptyArray) { if (type.resolvedBaseTypes === emptyArray) {
type.resolvedBaseTypes = [<ObjectType>baseType]; type.resolvedBaseTypes = [<ObjectType>baseType];
} }
else { else {
type.resolvedBaseTypes.push(<ObjectType>baseType); type.resolvedBaseTypes.push(baseType);
} }
} }
else { else {