@@ -5710,67 +5710,69 @@ namespace ts {
57105710 function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node: Node, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
57115711 const links = getNodeLinks(node);
57125712 if (!links.resolvedType) {
5713- const isSpread = (node.kind === SyntaxKind.TypeLiteral &&
5714- find((node as TypeLiteralNode).members, elt => elt.kind === SyntaxKind.SpreadTypeElement));
5715- let type: ObjectType;
5716- if (isSpread) {
5717- let members: Map<Symbol>;
5718- let stringIndexInfo: IndexInfo;
5719- let numberIndexInfo: IndexInfo;
5720- const spreads: Type[] = [];
5721- for (const member of (node as TypeLiteralNode).members) {
5722- if (member.kind === SyntaxKind.SpreadTypeElement) {
5723- if (members) {
5724- spreads.push(createAnonymousType(node.symbol, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5725- members = undefined;
5726- stringIndexInfo = undefined;
5727- numberIndexInfo = undefined;
5728- }
5729- spreads.push(getTypeFromTypeNode((member as SpreadTypeElement).type));
5730- }
5731- else if (member.kind === SyntaxKind.IndexSignature) {
5732- const index = member as IndexSignatureDeclaration;
5733- if (index.parameters.length === 1) {
5734- const parameter = index.parameters[0];
5735- if (parameter && parameter.type) {
5736- const indexInfo = createIndexInfo(index.type ? getTypeFromTypeNode(index.type) : anyType,
5737- (getModifierFlags(index) & ModifierFlags.Readonly) !== 0, index);
5738- if (parameter.type.kind === SyntaxKind.StringKeyword) {
5739- stringIndexInfo = indexInfo;
5740- }
5741- else {
5742- numberIndexInfo = indexInfo;
5743- }
5744- }
5713+ const hasSpread = (node.kind === SyntaxKind.TypeLiteral &&
5714+ find((node as TypeLiteralNode).members, elt => elt.kind === SyntaxKind.SpreadTypeElement));
5715+ if (hasSpread) {
5716+ return getTypeFromSpreadTypeLiteral(node, aliasSymbol, aliasTypeArguments);
5717+ }
5718+
5719+ let type = createObjectType(TypeFlags.Anonymous, node.symbol);
5720+ type.aliasSymbol = aliasSymbol;
5721+ type.aliasTypeArguments = aliasTypeArguments;
5722+ links.resolvedType = type;
5723+ }
5724+ return links.resolvedType;
5725+ }
5726+
5727+ function getTypeFromSpreadTypeLiteral(node: Node, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
5728+ let members: Map<Symbol>;
5729+ let stringIndexInfo: IndexInfo;
5730+ let numberIndexInfo: IndexInfo;
5731+ const spreads: Type[] = [];
5732+ for (const member of (node as TypeLiteralNode).members) {
5733+ if (member.kind === SyntaxKind.SpreadTypeElement) {
5734+ if (members) {
5735+ spreads.push(createAnonymousType(node.symbol, members, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5736+ members = undefined;
5737+ stringIndexInfo = undefined;
5738+ numberIndexInfo = undefined;
5739+ }
5740+ spreads.push(getTypeFromTypeNode((member as SpreadTypeElement).type));
5741+ }
5742+ else if (member.kind === SyntaxKind.IndexSignature) {
5743+ const index = member as IndexSignatureDeclaration;
5744+ if (index.parameters.length === 1) {
5745+ const parameter = index.parameters[0];
5746+ if (parameter && parameter.type) {
5747+ const indexInfo = createIndexInfo(index.type ? getTypeFromTypeNode(index.type) : anyType,
5748+ (getModifierFlags(index) & ModifierFlags.Readonly) !== 0, index);
5749+ if (parameter.type.kind === SyntaxKind.StringKeyword) {
5750+ stringIndexInfo = indexInfo;
57455751 }
5746- }
5747- else if (member.kind !== SyntaxKind.CallSignature && member.kind !== SyntaxKind.ConstructSignature) {
5748- // note that spread types don't include call and construct signatures
5749- const flags = SymbolFlags.Property | SymbolFlags.Transient | (member.questionToken ? SymbolFlags.Optional : 0);
5750- const text = getTextOfPropertyName(member.name);
5751- const symbol = <TransientSymbol>createSymbol(flags, text);
5752- symbol.declarations = [member];
5753- symbol.valueDeclaration = member;
5754- symbol.type = getTypeFromTypeNodeNoAlias((member as IndexSignatureDeclaration | PropertySignature | MethodSignature).type);
5755- if (!members) {
5756- members = createMap<Symbol>();
5752+ else {
5753+ numberIndexInfo = indexInfo;
57575754 }
5758- members[symbol.name] = symbol;
57595755 }
57605756 }
5761- if (members || stringIndexInfo || numberIndexInfo) {
5762- spreads.push(createAnonymousType(node.symbol, members || emptySymbols, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5763- }
5764- return getSpreadType(spreads, node.symbol, aliasSymbol, aliasTypeArguments);
57655757 }
5766- else {
5767- type = createObjectType(TypeFlags.Anonymous, node.symbol);
5758+ else if (member.kind !== SyntaxKind.CallSignature && member.kind !== SyntaxKind.ConstructSignature) {
5759+ // note that spread types don't include call and construct signatures
5760+ const flags = SymbolFlags.Property | SymbolFlags.Transient | (member.questionToken ? SymbolFlags.Optional : 0);
5761+ const text = getTextOfPropertyName(member.name);
5762+ const symbol = <TransientSymbol>createSymbol(flags, text);
5763+ symbol.declarations = [member];
5764+ symbol.valueDeclaration = member;
5765+ symbol.type = getTypeFromTypeNodeNoAlias((member as IndexSignatureDeclaration | PropertySignature | MethodSignature).type);
5766+ if (!members) {
5767+ members = createMap<Symbol>();
5768+ }
5769+ members[symbol.name] = symbol;
57685770 }
5769- type.aliasSymbol = aliasSymbol;
5770- type.aliasTypeArguments = aliasTypeArguments;
5771- links.resolvedType = type;
57725771 }
5773- return links.resolvedType;
5772+ if (members || stringIndexInfo || numberIndexInfo) {
5773+ spreads.push(createAnonymousType(node.symbol, members || emptySymbols, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo));
5774+ }
5775+ return getSpreadType(spreads, node.symbol, aliasSymbol, aliasTypeArguments);
57745776 }
57755777
57765778 function getSpreadType(types: Type[], symbol: Symbol, aliasSymbol?: Symbol, aliasTypeArguments?: Type[]): Type {
0 commit comments