From de900913991f208cbd391cc461f8a664d150401b Mon Sep 17 00:00:00 2001 From: graphemecluster Date: Tue, 26 Jul 2022 06:15:11 +0800 Subject: [PATCH 1/2] Better Inference for mapped array and tuple types --- src/compiler/checker.ts | 162 ++++++++++++---- src/lib/es5.d.ts | 8 +- .../arrayDestructuringInSwitch1.symbols | 5 +- .../arrayDestructuringInSwitch1.types | 10 +- ...mputedTypesKeyofNoIndexSignatureType.types | 6 +- .../reference/contextuallyTypedIife.types | 22 +-- .../contextuallyTypedIifeStrict.types | 22 +-- .../reference/implementArrayInterface.js | 2 +- .../reference/implementArrayInterface.symbols | 5 +- .../reference/implementArrayInterface.types | 4 +- .../jsxExcessPropsAndAssignability.errors.txt | 12 +- .../jsxExcessPropsAndAssignability.types | 2 +- .../reference/keyofAndIndexedAccess.types | 4 +- .../baselines/reference/mapOnTupleTypes01.js | 20 +- .../reference/mapOnTupleTypes01.symbols | 12 +- .../reference/mapOnTupleTypes01.types | 68 +++---- .../baselines/reference/mapOnTupleTypes02.js | 2 +- .../reference/mapOnTupleTypes02.types | 8 +- .../reference/mappedArrayLikeType.errors.txt | 56 ++++++ .../reference/mappedArrayLikeType.js | 50 +++++ .../reference/mappedArrayLikeType.symbols | 176 ++++++++++++++++++ .../reference/mappedArrayLikeType.types | 96 ++++++++++ .../reference/mappedTypeAsClauses.types | 2 +- .../objectAssignLikeNonUnionResult.types | 2 +- .../reference/reactHOCSpreadprops.types | 4 +- .../reactReadonlyHOCAssignabilityReal.types | 2 +- .../reference/recursiveMappedTypes.types | 4 +- .../restElementWithNumberPropertyName.types | 2 +- .../reference/restInvalidArgumentType.types | 2 +- .../restParameterWithBindingPattern3.types | 2 +- .../restPropertyWithBindingPattern.types | 4 +- ...dexOnExistingReadonlyFieldIsNotNever.types | 12 +- .../cases/compiler/implementArrayInterface.ts | 2 +- tests/cases/compiler/mapOnTupleTypes01.ts | 2 +- tests/cases/compiler/mappedArrayLikeType.ts | 46 +++++ 35 files changed, 680 insertions(+), 158 deletions(-) create mode 100644 tests/baselines/reference/mappedArrayLikeType.errors.txt create mode 100644 tests/baselines/reference/mappedArrayLikeType.js create mode 100644 tests/baselines/reference/mappedArrayLikeType.symbols create mode 100644 tests/baselines/reference/mappedArrayLikeType.types create mode 100644 tests/cases/compiler/mappedArrayLikeType.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7768b78ef3ecd..260380b150418 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8734,6 +8734,22 @@ namespace ts { const spreadableProperties: Symbol[] = []; const unspreadableToRestKeys: Type[] = []; + if (isArrayType(source)) { + return createAnonymousType(undefined, createSymbolTable(), emptyArray, emptyArray, [createIndexInfo(numberType, getElementTypeOfArrayType(source)!, /*isReadonly*/ false)]); + } + if (isTupleType(source)) { + const symbols: Symbol[] = []; + for (let i = 0; i < source.target.fixedLength; i++) { + if (!isTypeAssignableTo(getNumberLiteralType(i), omitKeyType)) { + const symbol = createSymbol(SymbolFlags.Property | (source.target.elementFlags[i] & ElementFlags.Optional ? SymbolFlags.Optional : 0), "" + i as __String); + symbol.type = getIndexedAccessType(source, getNumberLiteralType(i)); + symbols.push(symbol); + } + } + const tupleRestType = getRestTypeOfTupleType(source); + return createAnonymousType(undefined, createSymbolTable(symbols), emptyArray, emptyArray, tupleRestType ? [createIndexInfo(numberType, tupleRestType, /*isReadonly*/ false)] : emptyArray); + } + for (const prop of getPropertiesOfType(source)) { const literalTypeFromProperty = getLiteralTypeFromProperty(prop, TypeFlags.StringOrNumberLiteralOrUnique); if (!isTypeAssignableTo(literalTypeFromProperty, omitKeyType) @@ -8903,7 +8919,7 @@ namespace ts { // remaining tuple element types. Otherwise, the rest element has an array type with same // element type as the parent type. type = everyType(parentType, isTupleType) ? - mapType(parentType, t => sliceTupleType(t as TupleTypeReference, index)) : + mapType(parentType, t => sliceTupleType(t as TupleTypeReference, index), UnionReduction.Subtype) : createArrayType(elementType); } else if (isArrayLikeType(parentType)) { @@ -17108,20 +17124,20 @@ namespace ts { if (typeVariable !== mappedTypeVariable) { return mapTypeWithAlias(getReducedType(mappedTypeVariable), t => { if (t.flags & (TypeFlags.AnyOrUnknown | TypeFlags.InstantiableNonPrimitive | TypeFlags.Object | TypeFlags.Intersection) && t !== wildcardType && !isErrorType(t)) { - if (!type.declaration.nameType) { - let constraint; - if (isArrayType(t) || t.flags & TypeFlags.Any && findResolutionCycleStartIndex(typeVariable, TypeSystemPropertyName.ImmediateBaseConstraint) < 0 && - (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, isArrayOrTupleType)) { - return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable, t, mapper)); - } - if (isGenericTupleType(t)) { - return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); - } - if (isTupleType(t)) { - return instantiateMappedTupleType(t, type, prependTypeMapping(typeVariable, t, mapper)); - } + let constraint; + if (isArrayType(t) || t.flags & TypeFlags.Any && findResolutionCycleStartIndex(typeVariable, TypeSystemPropertyName.ImmediateBaseConstraint) < 0 && + (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, isArrayOrTupleType)) { + return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable, t, mapper)); + } + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } + if (isTupleType(t)) { + return instantiateMappedTupleType(t, type, typeVariable, mapper); } - return instantiateAnonymousType(type, prependTypeMapping(typeVariable, t, mapper)); + return t.symbol && t.symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface) && + instantiateMappedClassOrInterfaceType(t as InterfaceType, type, typeVariable, mapper) || + instantiateAnonymousType(type, prependTypeMapping(typeVariable, t, mapper)); } return t; }, aliasSymbol, aliasTypeArguments); @@ -17149,26 +17165,30 @@ namespace ts { return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); }); const newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); - return createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly); + const result = createTupleType(elementTypes, map(elementTypes, _ => ElementFlags.Variadic), newReadonly); + return isTypeIdenticalTo(tupleType.target, result) ? tupleType : result; } function instantiateMappedArrayType(arrayType: Type, mappedType: MappedType, mapper: TypeMapper) { const elementType = instantiateMappedTypeTemplate(mappedType, numberType, /*isOptional*/ true, mapper); - return isErrorType(elementType) ? errorType : + const result = isErrorType(elementType) ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); + return isTypeIdenticalTo(arrayType, result) ? arrayType : result; } - function instantiateMappedTupleType(tupleType: TupleTypeReference, mappedType: MappedType, mapper: TypeMapper) { + function instantiateMappedTupleType(tupleType: TupleTypeReference, mappedType: MappedType, typeVariable: TypeVariable, mapper: TypeMapper) { const elementFlags = tupleType.target.elementFlags; - const elementTypes = map(getTypeArguments(tupleType), (_, i) => - instantiateMappedTypeTemplate(mappedType, getStringLiteralType("" + i), !!(elementFlags[i] & ElementFlags.Optional), mapper)); + const elementTypes = map(getTypeArguments(tupleType), (elementType, i) => + instantiateMappedTypeTemplate(mappedType, i < tupleType.target.fixedLength ? getStringLiteralType("" + i) : numberType, !!(elementFlags[i] & ElementFlags.Optional), + appendTypeMapping(prependTypeMapping(typeVariable, tupleType, mapper), getIndexedAccessType(typeVariable, getTypeParameterFromMappedType(mappedType)), elementType))); const modifiers = getMappedTypeModifiers(mappedType); const newTupleModifiers = modifiers & MappedTypeModifiers.IncludeOptional ? map(elementFlags, f => f & ElementFlags.Required ? ElementFlags.Optional : f) : modifiers & MappedTypeModifiers.ExcludeOptional ? map(elementFlags, f => f & ElementFlags.Optional ? ElementFlags.Required : f) : elementFlags; const newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); - return contains(elementTypes, errorType) ? errorType : + const result = contains(elementTypes, errorType) ? errorType : createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); + return isTypeIdenticalTo(tupleType.target, result) ? tupleType : result; } function instantiateMappedTypeTemplate(type: MappedType, key: Type, isOptional: boolean, mapper: TypeMapper) { @@ -17180,6 +17200,67 @@ namespace ts { propType; } + function classOrInterfaceTypeMappedTypeMapper(t: Type, type: MappedType, typeVariable: TypeVariable, mapper: TypeMapper): Type | undefined { + if (t.flags & TypeFlags.Intersection) { + const intersectionTypes = (t as IntersectionType).types; + const mappedTypes = flatMap(intersectionTypes, t => classOrInterfaceTypeMappedTypeMapper(t, type, typeVariable, mapper)); + if (mappedTypes.length) { + return getIntersectionType(mappedTypes, t.aliasSymbol, t.aliasTypeArguments); + } + } + else if (t.flags & TypeFlags.Union) { + const unionTypes = (t as UnionType).types; + const mappedTypes = flatMap(unionTypes, t => classOrInterfaceTypeMappedTypeMapper(t, type, typeVariable, mapper)); + if (mappedTypes.length) { + return getUnionType(mappedTypes, UnionReduction.Literal, t.aliasSymbol, t.aliasTypeArguments); + } + } + else if (t.flags & (TypeFlags.AnyOrUnknown | TypeFlags.InstantiableNonPrimitive | TypeFlags.Object) && t !== wildcardType && !isErrorType(t)) { + let constraint; + if (isArrayType(t) || t.flags & TypeFlags.Any && findResolutionCycleStartIndex(typeVariable, TypeSystemPropertyName.ImmediateBaseConstraint) < 0 && + (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, isArrayOrTupleType)) { + return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable, t, mapper)); + } + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } + if (isTupleType(t)) { + return instantiateMappedTupleType(t, type, typeVariable, mapper); + } + if (t.symbol && t.symbol.flags & (SymbolFlags.Class | SymbolFlags.Interface)) { + return instantiateMappedClassOrInterfaceType(t as InterfaceType, type, typeVariable, mapper); + } + } + } + + function instantiateMappedClassOrInterfaceType(t: InterfaceType, type: MappedType, typeVariable: TypeVariable, mapper: TypeMapper): Type | undefined { + const baseTypes = getBaseTypes(t); + const mappedTypes = flatMap(baseTypes, t => classOrInterfaceTypeMappedTypeMapper(t, type, typeVariable, mapper)); + if (mappedTypes.length) { + const interfaceType = resolveDeclaredMembers(t); + const arrayLengthType = getTypeOfPropertyOfType(t, "length" as __String); + const maxLength = arrayLengthType && arrayLengthType.flags & TypeFlags.NumberLiteral ? (arrayLengthType as NumberLiteralType).value : Infinity; + const symbols = flatMap(interfaceType.declaredProperties, symbol => { + const name = symbol.escapedName; + if (isValidNumberString(name as string, /*roundTripOnly*/ true)) { + const n = +name; + if (n === n >>> 0 && n < maxLength) { + const newSymbol = createSymbol(symbol.flags, name, getCheckFlags(symbol)); + newSymbol.type = instantiateMappedTypeTemplate(type, getStringLiteralType(name as string), !!(symbol.flags & SymbolFlags.Optional), prependTypeMapping(typeVariable, t, mapper)); + return newSymbol; + } + } + if (name === "length") { + return symbol; + } + }); + if (symbols.length) { + return getIntersectionType([...mappedTypes, createAnonymousType(undefined, createSymbolTable(symbols), emptyArray, emptyArray, emptyArray)]); + } + return getIntersectionType(mappedTypes); + } + } + function instantiateAnonymousType(type: AnonymousType, mapper: TypeMapper, aliasSymbol?: Symbol, aliasTypeArguments?: readonly Type[]): AnonymousType { const result = createObjectType(type.objectFlags | ObjectFlags.Instantiated, type.symbol) as AnonymousType; if (type.objectFlags & ObjectFlags.Mapped) { @@ -17297,6 +17378,10 @@ namespace ts { return getStringMappingType((type as StringMappingType).symbol, instantiateType((type as StringMappingType).type, mapper)); } if (flags & TypeFlags.IndexedAccess) { + const mappedType = getMappedType(type, mapper); + if (mappedType !== type) { + return mappedType; + } const newAliasSymbol = aliasSymbol || type.aliasSymbol; const newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper); return getIndexedAccessType(instantiateType((type as IndexedAccessType).objectType, mapper), instantiateType((type as IndexedAccessType).indexType, mapper), (type as IndexedAccessType).accessFlags, /*accessNode*/ undefined, newAliasSymbol, newAliasTypeArguments); @@ -24031,9 +24116,9 @@ namespace ts { // Apply a mapping function to a type and return the resulting type. If the source type // is a union type, the mapping function is applied to each constituent type and a union // of the resulting types is returned. - function mapType(type: Type, mapper: (t: Type) => Type, noReductions?: boolean): Type; - function mapType(type: Type, mapper: (t: Type) => Type | undefined, noReductions?: boolean): Type | undefined; - function mapType(type: Type, mapper: (t: Type) => Type | undefined, noReductions?: boolean): Type | undefined { + function mapType(type: Type, mapper: (t: Type) => Type, unionReduction?: UnionReduction): Type; + function mapType(type: Type, mapper: (t: Type) => Type | undefined, unionReduction?: UnionReduction): Type | undefined; + function mapType(type: Type, mapper: (t: Type) => Type | undefined, unionReduction: UnionReduction = UnionReduction.Literal): Type | undefined { if (type.flags & TypeFlags.Never) { return type; } @@ -24045,7 +24130,7 @@ namespace ts { let mappedTypes: Type[] | undefined; let changed = false; for (const t of types) { - const mapped = t.flags & TypeFlags.Union ? mapType(t, mapper, noReductions) : mapper(t); + const mapped = t.flags & TypeFlags.Union ? mapType(t, mapper, unionReduction) : mapper(t); changed ||= t !== mapped; if (mapped) { if (!mappedTypes) { @@ -24056,12 +24141,14 @@ namespace ts { } } } - return changed ? mappedTypes && getUnionType(mappedTypes, noReductions ? UnionReduction.None : UnionReduction.Literal) : type; + return changed ? mappedTypes && getUnionType(mappedTypes, unionReduction) : type; } function mapTypeWithAlias(type: Type, mapper: (t: Type) => Type, aliasSymbol: Symbol | undefined, aliasTypeArguments: readonly Type[] | undefined) { return type.flags & TypeFlags.Union && aliasSymbol ? getUnionType(map((type as UnionType).types, mapper), UnionReduction.Literal, aliasSymbol, aliasTypeArguments) : + type.flags & TypeFlags.Intersection && aliasSymbol ? + getIntersectionType(map((type as IntersectionType).types, mapper), aliasSymbol, aliasTypeArguments) : mapType(type, mapper); } @@ -27076,7 +27163,7 @@ namespace ts { return concretePropertyType; } return getTypeOfApplicableIndexInfoOfContextualType(t); - }, /*noReductions*/ true); + }, UnionReduction.None); function getTypeOfConcretePropertyOfContextualType(t: Type) { if (isGenericMappedType(t) && !t.declaration.nameType) { @@ -27140,7 +27227,7 @@ namespace ts { if (element.name) { const nameType = getLiteralTypeFromPropertyName(element.name); // We avoid calling getApplicableIndexInfo here because it performs potentially expensive intersection reduction. - return mapType(type, t => findApplicableIndexInfo(getIndexInfosOfStructuredType(t), nameType)?.type, /*noReductions*/ true); + return mapType(type, t => findApplicableIndexInfo(getIndexInfosOfStructuredType(t), nameType)?.type, UnionReduction.None); } } return undefined; @@ -27156,7 +27243,7 @@ namespace ts { || mapType( arrayContextualType, t => getIteratedTypeOrElementType(IterationUse.Element, t, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false), - /*noReductions*/ true)); + UnionReduction.None)); } // In a contextually typed conditional expression, the true/false expressions are contextually typed by the same type. @@ -27182,7 +27269,7 @@ namespace ts { else { return t; } - }, /*noReductions*/ true)); + }, UnionReduction.None)); } function getContextualTypeForJsxExpression(node: JsxExpression, contextFlags: ContextFlags | undefined): Type | undefined { @@ -27276,7 +27363,7 @@ namespace ts { getContextualType(node, contextFlags); const instantiatedType = instantiateContextualType(contextualType, node, contextFlags); if (instantiatedType && !(contextFlags && contextFlags & ContextFlags.NoConstraints && instantiatedType.flags & TypeFlags.TypeVariable)) { - const apparentType = mapType(instantiatedType, getApparentType, /*noReductions*/ true); + const apparentType = mapType(instantiatedType, getApparentType, UnionReduction.None); return apparentType.flags & TypeFlags.Union && isObjectLiteralExpression(node) ? discriminateContextualTypeByObjectMembers(node, apparentType as UnionType) : apparentType.flags & TypeFlags.Union && isJsxAttributes(node) ? discriminateContextualTypeByJSXAttributes(node, apparentType as UnionType) : apparentType; @@ -34050,8 +34137,11 @@ namespace ts { else { leftType = checkExpression(left, checkMode); } - - const rightType = checkExpression(right, checkMode); + const leftTypeIsTuple = isTupleType(leftType); + const rightType = checkExpression(right, checkMode, /*forceTuple*/ leftTypeIsTuple); + if (!leftTypeIsTuple && isTupleType(rightType)) { + leftType = checkExpression(left, checkMode, /*forceTuple*/ true); + } return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode); } @@ -34542,8 +34632,12 @@ namespace ts { function checkConditionalExpression(node: ConditionalExpression, checkMode?: CheckMode): Type { checkTruthinessExpression(node.condition); checkTestingKnownTruthyCallableOrAwaitableType(node.condition, node.whenTrue); - const type1 = checkExpression(node.whenTrue, checkMode); - const type2 = checkExpression(node.whenFalse, checkMode); + let type1 = checkExpression(node.whenTrue, checkMode); + const type1IsTuple = isTupleType(type1); + const type2 = checkExpression(node.whenFalse, checkMode, /*forceTuple*/ type1IsTuple); + if (!type1IsTuple && isTupleType(type2)) { + type1 = checkExpression(node.whenTrue, checkMode, /*forceTuple*/ true); + } return getUnionType([type1, type2], UnionReduction.Subtype); } diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index b062a920c37c3..42610660dd061 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -1184,7 +1184,7 @@ interface ReadonlyArray { * @param thisArg An object to which the this keyword can refer in the predicate function. * If thisArg is omitted, undefined is used as the this value. */ - every(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is readonly S[]; + every(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is { [P in keyof this]: S }; /** * Determines whether all the members of an array satisfy the specified test. * @param predicate A function that accepts up to three arguments. The every method calls @@ -1214,7 +1214,7 @@ interface ReadonlyArray { * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ - map(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): U[]; + map(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): { -readonly [P in keyof this]: U }; /** * Returns the elements of an array that meet the condition specified in a callback function. * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array. @@ -1375,7 +1375,7 @@ interface Array { * @param thisArg An object to which the this keyword can refer in the predicate function. * If thisArg is omitted, undefined is used as the this value. */ - every(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[]; + every(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is { [P in keyof this]: S }; /** * Determines whether all the members of an array satisfy the specified test. * @param predicate A function that accepts up to three arguments. The every method calls @@ -1405,7 +1405,7 @@ interface Array { * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; /** * Returns the elements of an array that meet the condition specified in a callback function. * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array. diff --git a/tests/baselines/reference/arrayDestructuringInSwitch1.symbols b/tests/baselines/reference/arrayDestructuringInSwitch1.symbols index f1a9bea3fa35f..97d1318a97d36 100644 --- a/tests/baselines/reference/arrayDestructuringInSwitch1.symbols +++ b/tests/baselines/reference/arrayDestructuringInSwitch1.symbols @@ -29,9 +29,9 @@ export function evaluate(expression: Expression): boolean { case 'and': { return operands.every((child) => evaluate(child)); ->operands.every : Symbol(Array.every, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>operands.every : Symbol(Array.every, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) >operands : Symbol(operands, Decl(arrayDestructuringInSwitch1.ts, 5, 20)) ->every : Symbol(Array.every, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>every : Symbol(Array.every, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) >child : Symbol(child, Decl(arrayDestructuringInSwitch1.ts, 8, 31)) >evaluate : Symbol(evaluate, Decl(arrayDestructuringInSwitch1.ts, 1, 84)) >child : Symbol(child, Decl(arrayDestructuringInSwitch1.ts, 8, 31)) @@ -40,7 +40,6 @@ export function evaluate(expression: Expression): boolean { return !evaluate(operands[0]); >evaluate : Symbol(evaluate, Decl(arrayDestructuringInSwitch1.ts, 1, 84)) >operands : Symbol(operands, Decl(arrayDestructuringInSwitch1.ts, 5, 20)) ->0 : Symbol(0) } default: { throw new Error(`${operator} is not a supported operator`); diff --git a/tests/baselines/reference/arrayDestructuringInSwitch1.types b/tests/baselines/reference/arrayDestructuringInSwitch1.types index 56d48f6a30075..808c418a0cc20 100644 --- a/tests/baselines/reference/arrayDestructuringInSwitch1.types +++ b/tests/baselines/reference/arrayDestructuringInSwitch1.types @@ -18,7 +18,7 @@ export function evaluate(expression: Expression): boolean { const [operator, ...operands] = expression; >operator : "and" | "not" ->operands : Expression[] | [Expression] +>operands : Expression[] >expression : BooleanLogicExpression switch (operator) { @@ -29,9 +29,9 @@ export function evaluate(expression: Expression): boolean { return operands.every((child) => evaluate(child)); >operands.every((child) => evaluate(child)) : boolean ->operands.every : { (predicate: (value: Expression, index: number, array: Expression[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: Expression, index: number, array: Expression[]) => unknown, thisArg?: any): boolean; } | { (predicate: (value: Expression, index: number, array: Expression[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: Expression, index: number, array: Expression[]) => unknown, thisArg?: any): boolean; } ->operands : Expression[] | [Expression] ->every : { (predicate: (value: Expression, index: number, array: Expression[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: Expression, index: number, array: Expression[]) => unknown, thisArg?: any): boolean; } | { (predicate: (value: Expression, index: number, array: Expression[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: Expression, index: number, array: Expression[]) => unknown, thisArg?: any): boolean; } +>operands.every : { (predicate: (value: Expression, index: number, array: Expression[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: Expression, index: number, array: Expression[]) => unknown, thisArg?: any): boolean; } +>operands : Expression[] +>every : { (predicate: (value: Expression, index: number, array: Expression[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: Expression, index: number, array: Expression[]) => unknown, thisArg?: any): boolean; } >(child) => evaluate(child) : (child: Expression) => boolean >child : Expression >evaluate(child) : boolean @@ -46,7 +46,7 @@ export function evaluate(expression: Expression): boolean { >evaluate(operands[0]) : boolean >evaluate : (expression: Expression) => boolean >operands[0] : Expression ->operands : Expression[] | [Expression] +>operands : Expression[] >0 : 0 } default: { diff --git a/tests/baselines/reference/computedTypesKeyofNoIndexSignatureType.types b/tests/baselines/reference/computedTypesKeyofNoIndexSignatureType.types index ecf52ba235433..316be74969eb9 100644 --- a/tests/baselines/reference/computedTypesKeyofNoIndexSignatureType.types +++ b/tests/baselines/reference/computedTypesKeyofNoIndexSignatureType.types @@ -27,10 +27,10 @@ type FooBar = { foo: "hello"; bar: "world"; }; >bar : "world" type WithIndex = Compute; // { [x: string]: {}; foo: "hello"; bar: "world"; } <-- OK ->WithIndex : { [x: string]: {}; foo: "hello"; bar: "world"; } +>WithIndex : { foo: "hello"; bar: "world"; } & { [x: string]: {}; } type WithoutIndex = OmitIndex; // { foo: "hello"; bar: "world"; } <-- OK ->WithoutIndex : OmitIndex<{ [x: string]: {}; foo: "hello"; bar: "world"; }, string> +>WithoutIndex : OmitIndex<{ foo: "hello"; bar: "world"; }, string> & OmitIndex<{ [x: string]: {}; }, string> type FooBarKey = keyof FooBar; // "foo" | "bar" <-- OK >FooBarKey : keyof FooBar @@ -39,5 +39,5 @@ type WithIndexKey = keyof WithIndex; // string | number <-- Expected: stri >WithIndexKey : string | number type WithoutIndexKey = keyof WithoutIndex; // number <-- Expected: "foo" | "bar" ->WithoutIndexKey : "foo" | "bar" +>WithoutIndexKey : keyof FooBar diff --git a/tests/baselines/reference/contextuallyTypedIife.types b/tests/baselines/reference/contextuallyTypedIife.types index 6ba854a6df7a9..e71f0fe5952f3 100644 --- a/tests/baselines/reference/contextuallyTypedIife.types +++ b/tests/baselines/reference/contextuallyTypedIife.types @@ -105,9 +105,9 @@ >(...numbers) => numbers.every(n => n > 0) : (numbers_0: number, numbers_1: number, numbers_2: number) => boolean >numbers : [number, number, number] >numbers.every(n => n > 0) : boolean ->numbers.every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } +>numbers.every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } >numbers : [number, number, number] ->every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } +>every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } >n => n > 0 : (n: number) => boolean >n : number >n > 0 : boolean @@ -123,9 +123,9 @@ >(...mixed) => mixed.every(n => !!n) : (mixed_0: number, mixed_1: string, mixed_2: string) => boolean >mixed : [number, string, string] >mixed.every(n => !!n) : boolean ->mixed.every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } +>mixed.every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } >mixed : [number, string, string] ->every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } +>every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } >n => !!n : (n: string | number) => boolean >n : string | number >!!n : boolean @@ -151,18 +151,18 @@ >0 : 0 ((first, ...rest) => first ? [] : rest.map(n => n > 0))(8,9,10); ->((first, ...rest) => first ? [] : rest.map(n => n > 0))(8,9,10) : boolean[] ->((first, ...rest) => first ? [] : rest.map(n => n > 0)) : (first: number, rest_0: number, rest_1: number) => boolean[] ->(first, ...rest) => first ? [] : rest.map(n => n > 0) : (first: number, rest_0: number, rest_1: number) => boolean[] +>((first, ...rest) => first ? [] : rest.map(n => n > 0))(8,9,10) : [] | [boolean, boolean] +>((first, ...rest) => first ? [] : rest.map(n => n > 0)) : (first: number, rest_0: number, rest_1: number) => [] | [boolean, boolean] +>(first, ...rest) => first ? [] : rest.map(n => n > 0) : (first: number, rest_0: number, rest_1: number) => [] | [boolean, boolean] >first : number >rest : [number, number] ->first ? [] : rest.map(n => n > 0) : boolean[] +>first ? [] : rest.map(n => n > 0) : [boolean, boolean] | [] >first : number >[] : undefined[] ->rest.map(n => n > 0) : boolean[] ->rest.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>rest.map(n => n > 0) : [boolean, boolean] +>rest.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >rest : [number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >n => n > 0 : (n: number) => boolean >n : number >n > 0 : boolean diff --git a/tests/baselines/reference/contextuallyTypedIifeStrict.types b/tests/baselines/reference/contextuallyTypedIifeStrict.types index 05138e1cf985f..53abe7717c05a 100644 --- a/tests/baselines/reference/contextuallyTypedIifeStrict.types +++ b/tests/baselines/reference/contextuallyTypedIifeStrict.types @@ -105,9 +105,9 @@ >(...numbers) => numbers.every(n => n > 0) : (numbers_0: number, numbers_1: number, numbers_2: number) => boolean >numbers : [number, number, number] >numbers.every(n => n > 0) : boolean ->numbers.every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } +>numbers.every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } >numbers : [number, number, number] ->every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } +>every : { (predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; } >n => n > 0 : (n: number) => boolean >n : number >n > 0 : boolean @@ -123,9 +123,9 @@ >(...mixed) => mixed.every(n => !!n) : (mixed_0: number, mixed_1: string, mixed_2: string) => boolean >mixed : [number, string, string] >mixed.every(n => !!n) : boolean ->mixed.every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } +>mixed.every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } >mixed : [number, string, string] ->every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } +>every : { (predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is [S, S, S]; (predicate: (value: string | number, index: number, array: (string | number)[]) => unknown, thisArg?: any): boolean; } >n => !!n : (n: string | number) => boolean >n : string | number >!!n : boolean @@ -151,18 +151,18 @@ >0 : 0 ((first, ...rest) => first ? [] : rest.map(n => n > 0))(8,9,10); ->((first, ...rest) => first ? [] : rest.map(n => n > 0))(8,9,10) : boolean[] ->((first, ...rest) => first ? [] : rest.map(n => n > 0)) : (first: number, rest_0: number, rest_1: number) => boolean[] ->(first, ...rest) => first ? [] : rest.map(n => n > 0) : (first: number, rest_0: number, rest_1: number) => boolean[] +>((first, ...rest) => first ? [] : rest.map(n => n > 0))(8,9,10) : [] | [boolean, boolean] +>((first, ...rest) => first ? [] : rest.map(n => n > 0)) : (first: number, rest_0: number, rest_1: number) => [] | [boolean, boolean] +>(first, ...rest) => first ? [] : rest.map(n => n > 0) : (first: number, rest_0: number, rest_1: number) => [] | [boolean, boolean] >first : number >rest : [number, number] ->first ? [] : rest.map(n => n > 0) : boolean[] +>first ? [] : rest.map(n => n > 0) : [boolean, boolean] | [] >first : number >[] : never[] ->rest.map(n => n > 0) : boolean[] ->rest.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>rest.map(n => n > 0) : [boolean, boolean] +>rest.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >rest : [number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >n => n > 0 : (n: number) => boolean >n : number >n > 0 : boolean diff --git a/tests/baselines/reference/implementArrayInterface.js b/tests/baselines/reference/implementArrayInterface.js index 733a861071bae..9331e07bfed7d 100644 --- a/tests/baselines/reference/implementArrayInterface.js +++ b/tests/baselines/reference/implementArrayInterface.js @@ -20,7 +20,7 @@ declare class MyArray implements Array { every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; diff --git a/tests/baselines/reference/implementArrayInterface.symbols b/tests/baselines/reference/implementArrayInterface.symbols index 4df065b57732a..a180ea0fbc7fe 100644 --- a/tests/baselines/reference/implementArrayInterface.symbols +++ b/tests/baselines/reference/implementArrayInterface.symbols @@ -120,7 +120,7 @@ declare class MyArray implements Array { >T : Symbol(T, Decl(implementArrayInterface.ts, 0, 22)) >thisArg : Symbol(thisArg, Decl(implementArrayInterface.ts, 20, 70)) - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; >map : Symbol(MyArray.map, Decl(implementArrayInterface.ts, 20, 92)) >U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) >callbackfn : Symbol(callbackfn, Decl(implementArrayInterface.ts, 21, 11)) @@ -131,10 +131,11 @@ declare class MyArray implements Array { >T : Symbol(T, Decl(implementArrayInterface.ts, 0, 22)) >U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) >thisArg : Symbol(thisArg, Decl(implementArrayInterface.ts, 21, 66)) +>P : Symbol(P, Decl(implementArrayInterface.ts, 21, 86)) >U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; ->filter : Symbol(MyArray.filter, Decl(implementArrayInterface.ts, 21, 87)) +>filter : Symbol(MyArray.filter, Decl(implementArrayInterface.ts, 21, 108)) >callbackfn : Symbol(callbackfn, Decl(implementArrayInterface.ts, 22, 11)) >value : Symbol(value, Decl(implementArrayInterface.ts, 22, 24)) >T : Symbol(T, Decl(implementArrayInterface.ts, 0, 22)) diff --git a/tests/baselines/reference/implementArrayInterface.types b/tests/baselines/reference/implementArrayInterface.types index 4d0a012a17f5e..960ccafa5a376 100644 --- a/tests/baselines/reference/implementArrayInterface.types +++ b/tests/baselines/reference/implementArrayInterface.types @@ -92,8 +92,8 @@ declare class MyArray implements Array { >array : T[] >thisArg : any - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; ->map : (callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any) => U[] + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; +>map : (callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any) => { [P in keyof this]: U; } >callbackfn : (value: T, index: number, array: T[]) => U >value : T >index : number diff --git a/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt b/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt index dfe61765e395d..9d9d31ccc8913 100644 --- a/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt +++ b/tests/baselines/reference/jsxExcessPropsAndAssignability.errors.txt @@ -1,6 +1,8 @@ tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(13,27): error TS2698: Spread types may only be created from object types. -tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(14,6): error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Readonly<{ children?: ReactNode; }> & Readonly'. - Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'Readonly'. +tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(14,6): error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Readonly<{ children?: ReactNode; }> & Readonly & Readonly<{ myProp: string; }>'. + Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'Readonly<{ myProp: string; }>'. + Types of property 'myProp' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(14,27): error TS2698: Spread types may only be created from object types. @@ -22,8 +24,10 @@ tests/cases/compiler/jsxExcessPropsAndAssignability.tsx(14,27): error TS2698: Sp !!! error TS2698: Spread types may only be created from object types. ; ~~~~~~~~~~~~~~~~ -!!! error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Readonly<{ children?: ReactNode; }> & Readonly'. -!!! error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'Readonly'. +!!! error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes> & Readonly<{ children?: ReactNode; }> & Readonly & Readonly<{ myProp: string; }>'. +!!! error TS2322: Type 'ComposedComponentProps & { myProp: number; }' is not assignable to type 'Readonly<{ myProp: string; }>'. +!!! error TS2322: Types of property 'myProp' are incompatible. +!!! error TS2322: Type 'number' is not assignable to type 'string'. ~~~~~ !!! error TS2698: Spread types may only be created from object types. }; diff --git a/tests/baselines/reference/jsxExcessPropsAndAssignability.types b/tests/baselines/reference/jsxExcessPropsAndAssignability.types index b0c77ff1be2ad..34fd7ce7028d6 100644 --- a/tests/baselines/reference/jsxExcessPropsAndAssignability.types +++ b/tests/baselines/reference/jsxExcessPropsAndAssignability.types @@ -32,7 +32,7 @@ const myHoc = ( > : JSX.Element >WrapperComponent : React.ComponentClass >props : ComposedComponentProps ->myProp : "1000000" +>myProp : string >'1000000' : "1000000" ; diff --git a/tests/baselines/reference/keyofAndIndexedAccess.types b/tests/baselines/reference/keyofAndIndexedAccess.types index fc4603b997ff7..b557251e3e473 100644 --- a/tests/baselines/reference/keyofAndIndexedAccess.types +++ b/tests/baselines/reference/keyofAndIndexedAccess.types @@ -1920,11 +1920,11 @@ class AnotherSampleClass extends SampleClass { this.props.foo.concat; >this.props.foo.concat : (...strings: string[]) => string ->this.props.foo : (T & Foo)["foo"] +>this.props.foo : string >this.props : Readonly >this : this >props : Readonly ->foo : (T & Foo)["foo"] +>foo : string >concat : (...strings: string[]) => string } } diff --git a/tests/baselines/reference/mapOnTupleTypes01.js b/tests/baselines/reference/mapOnTupleTypes01.js index 3bf113ef57441..bb1252cd18d0e 100644 --- a/tests/baselines/reference/mapOnTupleTypes01.js +++ b/tests/baselines/reference/mapOnTupleTypes01.js @@ -39,7 +39,7 @@ export let g = numNumNumNumNum.map(n => n * n); let numNumNumNumNumNum: [number, number, number, number, number, number] = [1, 2, 3, 4, 5, 6]; -export let h = numNumNumNumNum.map(n => n * n); +export let h = numNumNumNumNumNum.map(n => n * n); //// [mapOnTupleTypes01.js] "use strict"; @@ -67,16 +67,16 @@ var numNumNumNumNum = [1, 2, 3, 4, 5]; exports.g = numNumNumNumNum.map(function (n) { return n * n; }); // Length 6 var numNumNumNumNumNum = [1, 2, 3, 4, 5, 6]; -exports.h = numNumNumNumNum.map(function (n) { return n * n; }); +exports.h = numNumNumNumNumNum.map(function (n) { return n * n; }); //// [mapOnTupleTypes01.d.ts] export declare let mapOnLooseArrayLiteral: number[]; -export declare let a: number[]; -export declare let b: number[]; -export declare let c: number[]; -export declare let d: (string | number)[]; -export declare let e: number[]; -export declare let f: number[]; -export declare let g: number[]; -export declare let h: number[]; +export declare let a: [number]; +export declare let b: [number, number]; +export declare let c: [number, number]; +export declare let d: [string | number, string | number]; +export declare let e: [number, number, number]; +export declare let f: [number, number, number, number]; +export declare let g: [number, number, number, number, number]; +export declare let h: [number, number, number, number, number, number]; diff --git a/tests/baselines/reference/mapOnTupleTypes01.symbols b/tests/baselines/reference/mapOnTupleTypes01.symbols index d3b55ab3509ca..eb2d0df955110 100644 --- a/tests/baselines/reference/mapOnTupleTypes01.symbols +++ b/tests/baselines/reference/mapOnTupleTypes01.symbols @@ -107,12 +107,12 @@ export let g = numNumNumNumNum.map(n => n * n); let numNumNumNumNumNum: [number, number, number, number, number, number] = [1, 2, 3, 4, 5, 6]; >numNumNumNumNumNum : Symbol(numNumNumNumNumNum, Decl(mapOnTupleTypes01.ts, 38, 3)) -export let h = numNumNumNumNum.map(n => n * n); +export let h = numNumNumNumNumNum.map(n => n * n); >h : Symbol(h, Decl(mapOnTupleTypes01.ts, 40, 10)) ->numNumNumNumNum.map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --)) ->numNumNumNumNum : Symbol(numNumNumNumNum, Decl(mapOnTupleTypes01.ts, 31, 3)) +>numNumNumNumNumNum.map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --)) +>numNumNumNumNumNum : Symbol(numNumNumNumNumNum, Decl(mapOnTupleTypes01.ts, 38, 3)) >map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --)) ->n : Symbol(n, Decl(mapOnTupleTypes01.ts, 40, 35)) ->n : Symbol(n, Decl(mapOnTupleTypes01.ts, 40, 35)) ->n : Symbol(n, Decl(mapOnTupleTypes01.ts, 40, 35)) +>n : Symbol(n, Decl(mapOnTupleTypes01.ts, 40, 38)) +>n : Symbol(n, Decl(mapOnTupleTypes01.ts, 40, 38)) +>n : Symbol(n, Decl(mapOnTupleTypes01.ts, 40, 38)) diff --git a/tests/baselines/reference/mapOnTupleTypes01.types b/tests/baselines/reference/mapOnTupleTypes01.types index adb8a2e191c26..97500771b3849 100644 --- a/tests/baselines/reference/mapOnTupleTypes01.types +++ b/tests/baselines/reference/mapOnTupleTypes01.types @@ -23,11 +23,11 @@ let numTuple: [number] = [1]; >1 : 1 export let a = numTuple.map(x => x * x); ->a : number[] ->numTuple.map(x => x * x) : number[] ->numTuple.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>a : [number] +>numTuple.map(x => x * x) : [number] +>numTuple.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U] >numTuple : [number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U] >x => x * x : (x: number) => number >x : number >x * x : number @@ -55,11 +55,11 @@ let numStr: [number, string] = [ 100, "hello"]; >"hello" : "hello" export let b = numNum.map(n => n * n); ->b : number[] ->numNum.map(n => n * n) : number[] ->numNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>b : [number, number] +>numNum.map(n => n * n) : [number, number] +>numNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >numNum : [number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >n => n * n : (n: number) => number >n : number >n * n : number @@ -67,11 +67,11 @@ export let b = numNum.map(n => n * n); >n : number export let c = strStr.map(s => s.charCodeAt(0)); ->c : number[] ->strStr.map(s => s.charCodeAt(0)) : number[] ->strStr.map : (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[] +>c : [number, number] +>strStr.map(s => s.charCodeAt(0)) : [number, number] +>strStr.map : (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => [U, U] >strStr : [string, string] ->map : (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => [U, U] >s => s.charCodeAt(0) : (s: string) => number >s : string >s.charCodeAt(0) : number @@ -81,11 +81,11 @@ export let c = strStr.map(s => s.charCodeAt(0)); >0 : 0 export let d = numStr.map(x => x); ->d : (string | number)[] ->numStr.map(x => x) : (string | number)[] ->numStr.map : (callbackfn: (value: string | number, index: number, array: (string | number)[]) => U, thisArg?: any) => U[] +>d : [string | number, string | number] +>numStr.map(x => x) : [string | number, string | number] +>numStr.map : (callbackfn: (value: string | number, index: number, array: (string | number)[]) => U, thisArg?: any) => [U, U] >numStr : [number, string] ->map : (callbackfn: (value: string | number, index: number, array: (string | number)[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: string | number, index: number, array: (string | number)[]) => U, thisArg?: any) => [U, U] >x => x : (x: string | number) => string | number >x : string | number >x : string | number @@ -100,11 +100,11 @@ let numNumNum: [number, number, number] = [1, 2, 3]; >3 : 3 export let e = numNumNum.map(n => n * n); ->e : number[] ->numNumNum.map(n => n * n) : number[] ->numNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>e : [number, number, number] +>numNumNum.map(n => n * n) : [number, number, number] +>numNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U] >numNumNum : [number, number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U] >n => n * n : (n: number) => number >n : number >n * n : number @@ -122,11 +122,11 @@ let numNumNumNum: [number, number, number, number] = [1, 2, 3, 4]; >4 : 4 export let f = numNumNumNum.map(n => n * n); ->f : number[] ->numNumNumNum.map(n => n * n) : number[] ->numNumNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>f : [number, number, number, number] +>numNumNumNum.map(n => n * n) : [number, number, number, number] +>numNumNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U, U] >numNumNumNum : [number, number, number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U, U] >n => n * n : (n: number) => number >n : number >n * n : number @@ -145,11 +145,11 @@ let numNumNumNumNum: [number, number, number, number, number] = [1, 2, 3, 4, 5]; >5 : 5 export let g = numNumNumNumNum.map(n => n * n); ->g : number[] ->numNumNumNumNum.map(n => n * n) : number[] ->numNumNumNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>g : [number, number, number, number, number] +>numNumNumNumNum.map(n => n * n) : [number, number, number, number, number] +>numNumNumNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U, U, U] >numNumNumNumNum : [number, number, number, number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U, U, U] >n => n * n : (n: number) => number >n : number >n * n : number @@ -169,12 +169,12 @@ let numNumNumNumNumNum: [number, number, number, number, number, number] = [1, 2 >5 : 5 >6 : 6 -export let h = numNumNumNumNum.map(n => n * n); ->h : number[] ->numNumNumNumNum.map(n => n * n) : number[] ->numNumNumNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] ->numNumNumNumNum : [number, number, number, number, number] ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +export let h = numNumNumNumNumNum.map(n => n * n); +>h : [number, number, number, number, number, number] +>numNumNumNumNumNum.map(n => n * n) : [number, number, number, number, number, number] +>numNumNumNumNumNum.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U, U, U, U] +>numNumNumNumNumNum : [number, number, number, number, number, number] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U, U, U, U, U] >n => n * n : (n: number) => number >n : number >n * n : number diff --git a/tests/baselines/reference/mapOnTupleTypes02.js b/tests/baselines/reference/mapOnTupleTypes02.js index 352abb24af5c5..8e6b27e8e4b3f 100644 --- a/tests/baselines/reference/mapOnTupleTypes02.js +++ b/tests/baselines/reference/mapOnTupleTypes02.js @@ -17,4 +17,4 @@ exports.increment = increment; //// [mapOnTupleTypes02.d.ts] export declare type Point = [number, number]; -export declare function increment(point: Point): number[]; +export declare function increment(point: Point): [number, number]; diff --git a/tests/baselines/reference/mapOnTupleTypes02.types b/tests/baselines/reference/mapOnTupleTypes02.types index 5e345f3ccf677..c6492fd891643 100644 --- a/tests/baselines/reference/mapOnTupleTypes02.types +++ b/tests/baselines/reference/mapOnTupleTypes02.types @@ -3,14 +3,14 @@ export type Point = [number, number]; >Point : [number, number] export function increment(point: Point) { ->increment : (point: Point) => number[] +>increment : (point: Point) => [number, number] >point : Point return point.map(d => d + 1); ->point.map(d => d + 1) : number[] ->point.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>point.map(d => d + 1) : [number, number] +>point.map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >point : Point ->map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => U[] +>map : (callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any) => [U, U] >d => d + 1 : (d: number) => number >d : number >d + 1 : number diff --git a/tests/baselines/reference/mappedArrayLikeType.errors.txt b/tests/baselines/reference/mappedArrayLikeType.errors.txt new file mode 100644 index 0000000000000..beb11c5e71f5a --- /dev/null +++ b/tests/baselines/reference/mappedArrayLikeType.errors.txt @@ -0,0 +1,56 @@ +tests/cases/compiler/mappedArrayLikeType.ts(39,11): error TS2430: Interface 'TZ' incorrectly extends interface '[T, ...string[], T]'. +tests/cases/compiler/mappedArrayLikeType.ts(46,11): error TS2430: Interface 'RTZ' incorrectly extends interface 'readonly [T, ...string[], T]'. + + +==== tests/cases/compiler/mappedArrayLikeType.ts (2 errors) ==== + type Tuple = [T, ...string[], T]; + type ReadonlyTuple = readonly [T, ...string[], T]; + + type Mapper = { [P in keyof T]: `${P}_${T[P]}` }; + + type A = string[] & { foo }; + type AMapped = Mapper; + + type RA = readonly string[] & { foo }; + type RAMapped = Mapper; + + type T = [number, ...string[], number] & { foo }; + type TMapped = Mapper; + + type RT = readonly [number, ...string[], number] & { foo }; + type RTMapped = Mapper; + + interface AX extends AY { + 0: T & {}; + length: 1; + foo: Mapper; + } + interface AY extends AZ { bar } + interface AZ extends Array { baz } + + interface RAX extends RAY { + 0: T & {}; + length: 1; + foo: Mapper; + } + interface RAY extends RAZ { bar } + interface RAZ extends ReadonlyArray { baz } + + interface TX extends TY { + 0: T & {}; + foo: Mapper; + } + interface TY extends TZ { bar } + interface TZ extends Tuple { baz } + ~~ +!!! error TS2430: Interface 'TZ' incorrectly extends interface '[T, ...string[], T]'. + + interface RTX extends RTY { + 0: T & {}; + foo: Mapper; + } + interface RTY extends RTZ { bar } + interface RTZ extends ReadonlyTuple { baz } + ~~~ +!!! error TS2430: Interface 'RTZ' incorrectly extends interface 'readonly [T, ...string[], T]'. + \ No newline at end of file diff --git a/tests/baselines/reference/mappedArrayLikeType.js b/tests/baselines/reference/mappedArrayLikeType.js new file mode 100644 index 0000000000000..402f679e28446 --- /dev/null +++ b/tests/baselines/reference/mappedArrayLikeType.js @@ -0,0 +1,50 @@ +//// [mappedArrayLikeType.ts] +type Tuple = [T, ...string[], T]; +type ReadonlyTuple = readonly [T, ...string[], T]; + +type Mapper = { [P in keyof T]: `${P}_${T[P]}` }; + +type A = string[] & { foo }; +type AMapped = Mapper; + +type RA = readonly string[] & { foo }; +type RAMapped = Mapper; + +type T = [number, ...string[], number] & { foo }; +type TMapped = Mapper; + +type RT = readonly [number, ...string[], number] & { foo }; +type RTMapped = Mapper; + +interface AX extends AY { + 0: T & {}; + length: 1; + foo: Mapper; +} +interface AY extends AZ { bar } +interface AZ extends Array { baz } + +interface RAX extends RAY { + 0: T & {}; + length: 1; + foo: Mapper; +} +interface RAY extends RAZ { bar } +interface RAZ extends ReadonlyArray { baz } + +interface TX extends TY { + 0: T & {}; + foo: Mapper; +} +interface TY extends TZ { bar } +interface TZ extends Tuple { baz } + +interface RTX extends RTY { + 0: T & {}; + foo: Mapper; +} +interface RTY extends RTZ { bar } +interface RTZ extends ReadonlyTuple { baz } + + +//// [mappedArrayLikeType.js] diff --git a/tests/baselines/reference/mappedArrayLikeType.symbols b/tests/baselines/reference/mappedArrayLikeType.symbols new file mode 100644 index 0000000000000..0745a537cf661 --- /dev/null +++ b/tests/baselines/reference/mappedArrayLikeType.symbols @@ -0,0 +1,176 @@ +=== tests/cases/compiler/mappedArrayLikeType.ts === +type Tuple = [T, ...string[], T]; +>Tuple : Symbol(Tuple, Decl(mappedArrayLikeType.ts, 0, 0)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 0, 11)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 0, 11)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 0, 11)) + +type ReadonlyTuple = readonly [T, ...string[], T]; +>ReadonlyTuple : Symbol(ReadonlyTuple, Decl(mappedArrayLikeType.ts, 0, 36)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 1, 19)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 1, 19)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 1, 19)) + +type Mapper = { [P in keyof T]: `${P}_${T[P]}` }; +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 3, 12)) +>P : Symbol(P, Decl(mappedArrayLikeType.ts, 3, 43)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 3, 12)) +>P : Symbol(P, Decl(mappedArrayLikeType.ts, 3, 43)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 3, 12)) +>P : Symbol(P, Decl(mappedArrayLikeType.ts, 3, 43)) + +type A = string[] & { foo }; +>A : Symbol(A, Decl(mappedArrayLikeType.ts, 3, 75)) +>foo : Symbol(foo, Decl(mappedArrayLikeType.ts, 5, 21)) + +type AMapped = Mapper; +>AMapped : Symbol(AMapped, Decl(mappedArrayLikeType.ts, 5, 28)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +>A : Symbol(A, Decl(mappedArrayLikeType.ts, 3, 75)) + +type RA = readonly string[] & { foo }; +>RA : Symbol(RA, Decl(mappedArrayLikeType.ts, 6, 25)) +>foo : Symbol(foo, Decl(mappedArrayLikeType.ts, 8, 31)) + +type RAMapped = Mapper; +>RAMapped : Symbol(RAMapped, Decl(mappedArrayLikeType.ts, 8, 38)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +>RA : Symbol(RA, Decl(mappedArrayLikeType.ts, 6, 25)) + +type T = [number, ...string[], number] & { foo }; +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 9, 27)) +>foo : Symbol(foo, Decl(mappedArrayLikeType.ts, 11, 42)) + +type TMapped = Mapper; +>TMapped : Symbol(TMapped, Decl(mappedArrayLikeType.ts, 11, 49)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 9, 27)) + +type RT = readonly [number, ...string[], number] & { foo }; +>RT : Symbol(RT, Decl(mappedArrayLikeType.ts, 12, 25)) +>foo : Symbol(foo, Decl(mappedArrayLikeType.ts, 14, 52)) + +type RTMapped = Mapper; +>RTMapped : Symbol(RTMapped, Decl(mappedArrayLikeType.ts, 14, 59)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +>RT : Symbol(RT, Decl(mappedArrayLikeType.ts, 12, 25)) + +interface AX extends AY { +>AX : Symbol(AX, Decl(mappedArrayLikeType.ts, 15, 27)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 17, 13)) +>AY : Symbol(AY, Decl(mappedArrayLikeType.ts, 21, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 17, 13)) + + 0: T & {}; +>0 : Symbol(AX[0], Decl(mappedArrayLikeType.ts, 17, 31)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 17, 13)) + + length: 1; +>length : Symbol(AX.length, Decl(mappedArrayLikeType.ts, 18, 12)) + + foo: Mapper; +>foo : Symbol(AX.foo, Decl(mappedArrayLikeType.ts, 19, 12)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +} +interface AY extends AZ { bar } +>AY : Symbol(AY, Decl(mappedArrayLikeType.ts, 21, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 22, 13)) +>AZ : Symbol(AZ, Decl(mappedArrayLikeType.ts, 22, 37)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 22, 13)) +>bar : Symbol(AY.bar, Decl(mappedArrayLikeType.ts, 22, 31)) + +interface AZ extends Array { baz } +>AZ : Symbol(AZ, Decl(mappedArrayLikeType.ts, 22, 37)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 23, 13)) +>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 23, 13)) +>baz : Symbol(AZ.baz, Decl(mappedArrayLikeType.ts, 23, 34)) + +interface RAX extends RAY { +>RAX : Symbol(RAX, Decl(mappedArrayLikeType.ts, 23, 40)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 25, 14)) +>RAY : Symbol(RAY, Decl(mappedArrayLikeType.ts, 29, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 25, 14)) + + 0: T & {}; +>0 : Symbol(RAX[0], Decl(mappedArrayLikeType.ts, 25, 34)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 25, 14)) + + length: 1; +>length : Symbol(RAX.length, Decl(mappedArrayLikeType.ts, 26, 12)) + + foo: Mapper; +>foo : Symbol(RAX.foo, Decl(mappedArrayLikeType.ts, 27, 12)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +} +interface RAY extends RAZ { bar } +>RAY : Symbol(RAY, Decl(mappedArrayLikeType.ts, 29, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 30, 14)) +>RAZ : Symbol(RAZ, Decl(mappedArrayLikeType.ts, 30, 39)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 30, 14)) +>bar : Symbol(RAY.bar, Decl(mappedArrayLikeType.ts, 30, 33)) + +interface RAZ extends ReadonlyArray { baz } +>RAZ : Symbol(RAZ, Decl(mappedArrayLikeType.ts, 30, 39)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 31, 14)) +>ReadonlyArray : Symbol(ReadonlyArray, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 31, 14)) +>baz : Symbol(RAZ.baz, Decl(mappedArrayLikeType.ts, 31, 43)) + +interface TX extends TY { +>TX : Symbol(TX, Decl(mappedArrayLikeType.ts, 31, 49)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 33, 13)) +>TY : Symbol(TY, Decl(mappedArrayLikeType.ts, 36, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 33, 13)) + + 0: T & {}; +>0 : Symbol(TX[0], Decl(mappedArrayLikeType.ts, 33, 32)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 33, 13)) + + foo: Mapper; +>foo : Symbol(TX.foo, Decl(mappedArrayLikeType.ts, 34, 12)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +} +interface TY extends TZ { bar } +>TY : Symbol(TY, Decl(mappedArrayLikeType.ts, 36, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 37, 13)) +>TZ : Symbol(TZ, Decl(mappedArrayLikeType.ts, 37, 37)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 37, 13)) +>bar : Symbol(TY.bar, Decl(mappedArrayLikeType.ts, 37, 31)) + +interface TZ extends Tuple { baz } +>TZ : Symbol(TZ, Decl(mappedArrayLikeType.ts, 37, 37)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 38, 13)) +>Tuple : Symbol(Tuple, Decl(mappedArrayLikeType.ts, 0, 0)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 38, 13)) +>baz : Symbol(TZ.baz, Decl(mappedArrayLikeType.ts, 38, 34)) + +interface RTX extends RTY { +>RTX : Symbol(RTX, Decl(mappedArrayLikeType.ts, 38, 40)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 40, 14)) +>RTY : Symbol(RTY, Decl(mappedArrayLikeType.ts, 43, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 40, 14)) + + 0: T & {}; +>0 : Symbol(RTX[0], Decl(mappedArrayLikeType.ts, 40, 34)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 40, 14)) + + foo: Mapper; +>foo : Symbol(RTX.foo, Decl(mappedArrayLikeType.ts, 41, 12)) +>Mapper : Symbol(Mapper, Decl(mappedArrayLikeType.ts, 1, 53)) +} +interface RTY extends RTZ { bar } +>RTY : Symbol(RTY, Decl(mappedArrayLikeType.ts, 43, 1)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 44, 14)) +>RTZ : Symbol(RTZ, Decl(mappedArrayLikeType.ts, 44, 39)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 44, 14)) +>bar : Symbol(RTY.bar, Decl(mappedArrayLikeType.ts, 44, 33)) + +interface RTZ extends ReadonlyTuple { baz } +>RTZ : Symbol(RTZ, Decl(mappedArrayLikeType.ts, 44, 39)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 45, 14)) +>ReadonlyTuple : Symbol(ReadonlyTuple, Decl(mappedArrayLikeType.ts, 0, 36)) +>T : Symbol(T, Decl(mappedArrayLikeType.ts, 45, 14)) +>baz : Symbol(RTZ.baz, Decl(mappedArrayLikeType.ts, 45, 43)) + diff --git a/tests/baselines/reference/mappedArrayLikeType.types b/tests/baselines/reference/mappedArrayLikeType.types new file mode 100644 index 0000000000000..17875c6b2436a --- /dev/null +++ b/tests/baselines/reference/mappedArrayLikeType.types @@ -0,0 +1,96 @@ +=== tests/cases/compiler/mappedArrayLikeType.ts === +type Tuple = [T, ...string[], T]; +>Tuple : Tuple + +type ReadonlyTuple = readonly [T, ...string[], T]; +>ReadonlyTuple : ReadonlyTuple + +type Mapper = { [P in keyof T]: `${P}_${T[P]}` }; +>Mapper : Mapper + +type A = string[] & { foo }; +>A : string[] & { foo: any; } +>foo : any + +type AMapped = Mapper; +>AMapped : `${number}_${string}`[] & Mapper<{ foo: any; }> + +type RA = readonly string[] & { foo }; +>RA : readonly string[] & { foo: any; } +>foo : any + +type RAMapped = Mapper; +>RAMapped : readonly `${number}_${string}`[] & Mapper<{ foo: any; }> + +type T = [number, ...string[], number] & { foo }; +>T : [number, ...string[], number] & { foo: any; } +>foo : any + +type TMapped = Mapper; +>TMapped : [`0_${number}`, ...(`${number}_${string}` | `${number}_${number}`)[], `${number}_${string}` | `${number}_${number}`] & Mapper<{ foo: any; }> + +type RT = readonly [number, ...string[], number] & { foo }; +>RT : readonly [number, ...string[], number] & { foo: any; } +>foo : any + +type RTMapped = Mapper; +>RTMapped : readonly [`0_${number}`, ...(`${number}_${string}` | `${number}_${number}`)[], `${number}_${string}` | `${number}_${number}`] & Mapper<{ foo: any; }> + +interface AX extends AY { + 0: T & {}; +>0 : T & {} + + length: 1; +>length : 1 + + foo: Mapper; +>foo : `${number}_${T}`[] & { 0: `0_${this["0"]}`; length: 1; } +} +interface AY extends AZ { bar } +>bar : any + +interface AZ extends Array { baz } +>baz : any + +interface RAX extends RAY { + 0: T & {}; +>0 : T & {} + + length: 1; +>length : 1 + + foo: Mapper; +>foo : readonly `${number}_${T}`[] & { 0: `0_${this["0"]}`; length: 1; } +} +interface RAY extends RAZ { bar } +>bar : any + +interface RAZ extends ReadonlyArray { baz } +>baz : any + +interface TX extends TY { + 0: T & {}; +>0 : T & {} + + foo: Mapper; +>foo : [`0_${T}`, ...(`${number}_${string}` | `${number}_${T}`)[], `${number}_${string}` | `${number}_${T}`] & { 0: `0_${this["0"]}`; } +} +interface TY extends TZ { bar } +>bar : any + +interface TZ extends Tuple { baz } +>baz : any + +interface RTX extends RTY { + 0: T & {}; +>0 : T & {} + + foo: Mapper; +>foo : readonly [`0_${T}`, ...(`${number}_${string}` | `${number}_${T}`)[], `${number}_${string}` | `${number}_${T}`] & { 0: `0_${this["0"]}`; } +} +interface RTY extends RTZ { bar } +>bar : any + +interface RTZ extends ReadonlyTuple { baz } +>baz : any + diff --git a/tests/baselines/reference/mappedTypeAsClauses.types b/tests/baselines/reference/mappedTypeAsClauses.types index de951157933a3..47024964cc99f 100644 --- a/tests/baselines/reference/mappedTypeAsClauses.types +++ b/tests/baselines/reference/mappedTypeAsClauses.types @@ -36,7 +36,7 @@ type TA1 = Getters; >TA1 : { getConcat: () => { (...items: ConcatArray[]): string[]; (...items: (string | ConcatArray)[]): string[]; }; getIndexOf: () => (searchElement: string, fromIndex?: number | undefined) => number; getLastIndexOf: () => (searchElement: string, fromIndex?: number | undefined) => number; getSlice: () => (start?: number | undefined, end?: number | undefined) => string[]; getLength: () => number; getToString: () => () => string; getToLocaleString: () => () => string; getPop: () => () => string | undefined; getPush: () => (...items: string[]) => number; getJoin: () => (separator?: string | undefined) => string; getReverse: () => () => string[]; getShift: () => () => string | undefined; getSort: () => (compareFn?: ((a: string, b: string) => number) | undefined) => string[]; getSplice: () => { (start: number, deleteCount?: number | undefined): string[]; (start: number, deleteCount: number, ...items: string[]): string[]; }; getUnshift: () => (...items: string[]) => number; getEvery: () => { (predicate: (value: string, index: number, array: string[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: string, index: number, array: string[]) => unknown, thisArg?: any): boolean; }; getSome: () => (predicate: (value: string, index: number, array: string[]) => unknown, thisArg?: any) => boolean; getForEach: () => (callbackfn: (value: string, index: number, array: string[]) => void, thisArg?: any) => void; getMap: () => (callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]; getFilter: () => { (predicate: (value: string, index: number, array: string[]) => value is S, thisArg?: any): S[]; (predicate: (value: string, index: number, array: string[]) => unknown, thisArg?: any): string[]; }; getReduce: () => { (callbackfn: (previousValue: string, currentValue: string, currentIndex: number, array: string[]) => string): string; (callbackfn: (previousValue: string, currentValue: string, currentIndex: number, array: string[]) => string, initialValue: string): string; (callbackfn: (previousValue: U, currentValue: string, currentIndex: number, array: string[]) => U, initialValue: U): U; }; getReduceRight: () => { (callbackfn: (previousValue: string, currentValue: string, currentIndex: number, array: string[]) => string): string; (callbackfn: (previousValue: string, currentValue: string, currentIndex: number, array: string[]) => string, initialValue: string): string; (callbackfn: (previousValue: U, currentValue: string, currentIndex: number, array: string[]) => U, initialValue: U): U; }; } type TA2 = Getters<[number, boolean]>; ->TA2 : { getConcat: () => { (...items: ConcatArray[]): (number | boolean)[]; (...items: (number | boolean | ConcatArray)[]): (number | boolean)[]; }; getIndexOf: () => (searchElement: number | boolean, fromIndex?: number | undefined) => number; getLastIndexOf: () => (searchElement: number | boolean, fromIndex?: number | undefined) => number; getSlice: () => (start?: number | undefined, end?: number | undefined) => (number | boolean)[]; getLength: () => 2; getToString: () => () => string; getToLocaleString: () => () => string; getPop: () => () => number | boolean | undefined; getPush: () => (...items: (number | boolean)[]) => number; getJoin: () => (separator?: string | undefined) => string; getReverse: () => () => (number | boolean)[]; getShift: () => () => number | boolean | undefined; getSort: () => (compareFn?: ((a: number | boolean, b: number | boolean) => number) | undefined) => [number, boolean]; getSplice: () => { (start: number, deleteCount?: number | undefined): (number | boolean)[]; (start: number, deleteCount: number, ...items: (number | boolean)[]): (number | boolean)[]; }; getUnshift: () => (...items: (number | boolean)[]) => number; getEvery: () => { (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => unknown, thisArg?: any): boolean; }; getSome: () => (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => unknown, thisArg?: any) => boolean; getForEach: () => (callbackfn: (value: number | boolean, index: number, array: (number | boolean)[]) => void, thisArg?: any) => void; getMap: () => (callbackfn: (value: number | boolean, index: number, array: (number | boolean)[]) => U, thisArg?: any) => U[]; getFilter: () => { (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => value is S, thisArg?: any): S[]; (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => unknown, thisArg?: any): (number | boolean)[]; }; getReduce: () => { (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean): number | boolean; (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean, initialValue: number | boolean): number | boolean; (callbackfn: (previousValue: U, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => U, initialValue: U): U; }; getReduceRight: () => { (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean): number | boolean; (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean, initialValue: number | boolean): number | boolean; (callbackfn: (previousValue: U, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => U, initialValue: U): U; }; get0: () => number; get1: () => boolean; } +>TA2 : { getConcat: () => { (...items: ConcatArray[]): (number | boolean)[]; (...items: (number | boolean | ConcatArray)[]): (number | boolean)[]; }; getIndexOf: () => (searchElement: number | boolean, fromIndex?: number | undefined) => number; getLastIndexOf: () => (searchElement: number | boolean, fromIndex?: number | undefined) => number; getSlice: () => (start?: number | undefined, end?: number | undefined) => (number | boolean)[]; getLength: () => 2; getToString: () => () => string; getToLocaleString: () => () => string; getPop: () => () => number | boolean | undefined; getPush: () => (...items: (number | boolean)[]) => number; getJoin: () => (separator?: string | undefined) => string; getReverse: () => () => (number | boolean)[]; getShift: () => () => number | boolean | undefined; getSort: () => (compareFn?: ((a: number | boolean, b: number | boolean) => number) | undefined) => [number, boolean]; getSplice: () => { (start: number, deleteCount?: number | undefined): (number | boolean)[]; (start: number, deleteCount: number, ...items: (number | boolean)[]): (number | boolean)[]; }; getUnshift: () => (...items: (number | boolean)[]) => number; getEvery: () => { (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => value is S, thisArg?: any): this is [S, S]; (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => unknown, thisArg?: any): boolean; }; getSome: () => (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => unknown, thisArg?: any) => boolean; getForEach: () => (callbackfn: (value: number | boolean, index: number, array: (number | boolean)[]) => void, thisArg?: any) => void; getMap: () => (callbackfn: (value: number | boolean, index: number, array: (number | boolean)[]) => U, thisArg?: any) => [U, U]; getFilter: () => { (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => value is S, thisArg?: any): S[]; (predicate: (value: number | boolean, index: number, array: (number | boolean)[]) => unknown, thisArg?: any): (number | boolean)[]; }; getReduce: () => { (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean): number | boolean; (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean, initialValue: number | boolean): number | boolean; (callbackfn: (previousValue: U, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => U, initialValue: U): U; }; getReduceRight: () => { (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean): number | boolean; (callbackfn: (previousValue: number | boolean, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => number | boolean, initialValue: number | boolean): number | boolean; (callbackfn: (previousValue: U, currentValue: number | boolean, currentIndex: number, array: (number | boolean)[]) => U, initialValue: U): U; }; get0: () => number; get1: () => boolean; } // Filtering using 'as N' clause diff --git a/tests/baselines/reference/objectAssignLikeNonUnionResult.types b/tests/baselines/reference/objectAssignLikeNonUnionResult.types index 7553d3e589c1c..a54d1d34e28e3 100644 --- a/tests/baselines/reference/objectAssignLikeNonUnionResult.types +++ b/tests/baselines/reference/objectAssignLikeNonUnionResult.types @@ -38,7 +38,7 @@ type ExtractRawComponent = T extends { __raw: infer C } ? [L1: T, L2: C] : [R >__raw : C type t1 = ExtractRawComponent; ->t1 : [R1: Interface & { field: number; }] +>t1 : [R1: Interface] & [R1: { field: number; }] >data1 : Interface & { field: number; } // ??? diff --git a/tests/baselines/reference/reactHOCSpreadprops.types b/tests/baselines/reference/reactHOCSpreadprops.types index 2480196a2177e..300b794c1a5a0 100644 --- a/tests/baselines/reference/reactHOCSpreadprops.types +++ b/tests/baselines/reference/reactHOCSpreadprops.types @@ -22,9 +22,9 @@ function f

(App: React.ComponentClass

| React.StatelessComponent

): void return ; > : JSX.Element >App : React.ComponentClass | React.StatelessComponent

->this.props : Readonly<{ children?: React.ReactNode; }> & Readonly

+>this.props : Readonly<{ children?: React.ReactNode; }> & Readonly

& Readonly<{ x: number; }> >this : this ->props : Readonly<{ children?: React.ReactNode; }> & Readonly

+>props : Readonly<{ children?: React.ReactNode; }> & Readonly

& Readonly<{ x: number; }> } } } diff --git a/tests/baselines/reference/reactReadonlyHOCAssignabilityReal.types b/tests/baselines/reference/reactReadonlyHOCAssignabilityReal.types index befb43a43a26e..1fedb6e1fe334 100644 --- a/tests/baselines/reference/reactReadonlyHOCAssignabilityReal.types +++ b/tests/baselines/reference/reactReadonlyHOCAssignabilityReal.types @@ -26,7 +26,7 @@ function myHigherOrderComponent

(Inner: React.ComponentClass

this.props : Readonly<{ children?: React.ReactNode; }> & Readonly

>this : this >props : Readonly<{ children?: React.ReactNode; }> & Readonly

->name : "Matt" +>name : string } }; } diff --git a/tests/baselines/reference/recursiveMappedTypes.types b/tests/baselines/reference/recursiveMappedTypes.types index 14c2167f189d6..4ca42e70fab93 100644 --- a/tests/baselines/reference/recursiveMappedTypes.types +++ b/tests/baselines/reference/recursiveMappedTypes.types @@ -79,9 +79,9 @@ declare var product: Transform; >product : Transform product.users; // (Transform | Transform)[] ->product.users : Transform[] +>product.users : (User | Guest)[] >product : Transform ->users : Transform[] +>users : (User | Guest)[] // Repro from #29702 diff --git a/tests/baselines/reference/restElementWithNumberPropertyName.types b/tests/baselines/reference/restElementWithNumberPropertyName.types index 3764ac6dca41e..041b390fa665a 100644 --- a/tests/baselines/reference/restElementWithNumberPropertyName.types +++ b/tests/baselines/reference/restElementWithNumberPropertyName.types @@ -1,7 +1,7 @@ === tests/cases/compiler/restElementWithNumberPropertyName.ts === const { 0: a, ...b } = [0, 1, 2]; >a : number ->b : { [n: number]: number; 0: number; 1: number; 2: number; length: 3; toString(): string; toLocaleString(): string; pop(): number; push(...items: number[]): number; concat(...items: ConcatArray[]): number[]; concat(...items: (number | ConcatArray)[]): number[]; join(separator?: string): string; reverse(): number[]; shift(): number; slice(start?: number, end?: number): number[]; sort(compareFn?: (a: number, b: number) => number): [number, number, number]; splice(start: number, deleteCount?: number): number[]; splice(start: number, deleteCount: number, ...items: number[]): number[]; unshift(...items: number[]): number; indexOf(searchElement: number, fromIndex?: number): number; lastIndexOf(searchElement: number, fromIndex?: number): number; every(predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): this is S[]; every(predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; some(predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: number, index: number, array: number[]) => void, thisArg?: any): void; map(callbackfn: (value: number, index: number, array: number[]) => U, thisArg?: any): U[]; filter(predicate: (value: number, index: number, array: number[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: number, index: number, array: number[]) => unknown, thisArg?: any): number[]; reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number): number; reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number; reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number): number; reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: number[]) => number, initialValue: number): number; reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: number[]) => U, initialValue: U): U; } +>b : { 1: number; 2: number; } >[0, 1, 2] : [number, number, number] >0 : 0 >1 : 1 diff --git a/tests/baselines/reference/restInvalidArgumentType.types b/tests/baselines/reference/restInvalidArgumentType.types index 119b0394726da..8188d532dea6a 100644 --- a/tests/baselines/reference/restInvalidArgumentType.types +++ b/tests/baselines/reference/restInvalidArgumentType.types @@ -71,7 +71,7 @@ function f(p1: T, p2: T[]) { >p1 : T var {...r2} = p2; // OK ->r2 : { [n: number]: T; length: number; toString(): string; toLocaleString(): string; pop(): T; push(...items: T[]): number; concat(...items: ConcatArray[]): T[]; concat(...items: (T | ConcatArray)[]): T[]; join(separator?: string): string; reverse(): T[]; shift(): T; slice(start?: number, end?: number): T[]; sort(compareFn?: (a: T, b: T) => number): T[]; splice(start: number, deleteCount?: number): T[]; splice(start: number, deleteCount: number, ...items: T[]): T[]; unshift(...items: T[]): number; indexOf(searchElement: T, fromIndex?: number): number; lastIndexOf(searchElement: T, fromIndex?: number): number; every(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[]; every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean; some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; filter(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[]; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T; reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; } +>r2 : { [x: number]: T; } >p2 : T[] var {...r3} = t; // Error, generic type paramter diff --git a/tests/baselines/reference/restParameterWithBindingPattern3.types b/tests/baselines/reference/restParameterWithBindingPattern3.types index 392cb1cd90a3e..b3c8cd96fee40 100644 --- a/tests/baselines/reference/restParameterWithBindingPattern3.types +++ b/tests/baselines/reference/restParameterWithBindingPattern3.types @@ -31,5 +31,5 @@ function e(...{0: a = 1, 1: b = true, ...rest: rest}: [boolean, string, number]) >b : string >true : true >rest : any ->rest : { [n: number]: string | number | boolean; 0: boolean; 1: string; 2: number; length: 3; toString(): string; toLocaleString(): string; pop(): string | number | boolean; push(...items: (string | number | boolean)[]): number; concat(...items: ConcatArray[]): (string | number | boolean)[]; concat(...items: (string | number | boolean | ConcatArray)[]): (string | number | boolean)[]; join(separator?: string): string; reverse(): (string | number | boolean)[]; shift(): string | number | boolean; slice(start?: number, end?: number): (string | number | boolean)[]; sort(compareFn?: (a: string | number | boolean, b: string | number | boolean) => number): [boolean, string, number]; splice(start: number, deleteCount?: number): (string | number | boolean)[]; splice(start: number, deleteCount: number, ...items: (string | number | boolean)[]): (string | number | boolean)[]; unshift(...items: (string | number | boolean)[]): number; indexOf(searchElement: string | number | boolean, fromIndex?: number): number; lastIndexOf(searchElement: string | number | boolean, fromIndex?: number): number; every(predicate: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => value is S, thisArg?: any): this is S[]; every(predicate: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => unknown, thisArg?: any): boolean; some(predicate: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => void, thisArg?: any): void; map(callbackfn: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => U, thisArg?: any): U[]; filter(predicate: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: string | number | boolean, index: number, array: (string | number | boolean)[]) => unknown, thisArg?: any): (string | number | boolean)[]; reduce(callbackfn: (previousValue: string | number | boolean, currentValue: string | number | boolean, currentIndex: number, array: (string | number | boolean)[]) => string | number | boolean): string | number | boolean; reduce(callbackfn: (previousValue: string | number | boolean, currentValue: string | number | boolean, currentIndex: number, array: (string | number | boolean)[]) => string | number | boolean, initialValue: string | number | boolean): string | number | boolean; reduce(callbackfn: (previousValue: U, currentValue: string | number | boolean, currentIndex: number, array: (string | number | boolean)[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: string | number | boolean, currentValue: string | number | boolean, currentIndex: number, array: (string | number | boolean)[]) => string | number | boolean): string | number | boolean; reduceRight(callbackfn: (previousValue: string | number | boolean, currentValue: string | number | boolean, currentIndex: number, array: (string | number | boolean)[]) => string | number | boolean, initialValue: string | number | boolean): string | number | boolean; reduceRight(callbackfn: (previousValue: U, currentValue: string | number | boolean, currentIndex: number, array: (string | number | boolean)[]) => U, initialValue: U): U; } +>rest : { 2: number; } diff --git a/tests/baselines/reference/restPropertyWithBindingPattern.types b/tests/baselines/reference/restPropertyWithBindingPattern.types index 988d9b3c7afdc..306ace0b04c15 100644 --- a/tests/baselines/reference/restPropertyWithBindingPattern.types +++ b/tests/baselines/reference/restPropertyWithBindingPattern.types @@ -17,14 +17,14 @@ ({...[]} = {}); >({...[]} = {}) : {} >{...[]} = {} : {} ->{...[]} : { [n: number]: never; length: 0; toString(): string; toLocaleString(): string; pop(): never; push(...items: never[]): number; concat(...items: ConcatArray[]): never[]; concat(...items: ConcatArray[]): never[]; join(separator?: string): string; reverse(): never[]; shift(): never; slice(start?: number, end?: number): never[]; sort(compareFn?: (a: never, b: never) => number): []; splice(start: number, deleteCount?: number): never[]; splice(start: number, deleteCount: number, ...items: never[]): never[]; unshift(...items: never[]): number; indexOf(searchElement: never, fromIndex?: number): number; lastIndexOf(searchElement: never, fromIndex?: number): number; every(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): this is S[]; every(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; some(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: never, index: number, array: never[]) => void, thisArg?: any): void; map(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any): U[]; filter(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): never[]; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduce(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduceRight(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; } +>{...[]} : { [n: number]: never; length: 0; toString(): string; toLocaleString(): string; pop(): never; push(...items: never[]): number; concat(...items: ConcatArray[]): never[]; concat(...items: ConcatArray[]): never[]; join(separator?: string): string; reverse(): never[]; shift(): never; slice(start?: number, end?: number): never[]; sort(compareFn?: (a: never, b: never) => number): []; splice(start: number, deleteCount?: number): never[]; splice(start: number, deleteCount: number, ...items: never[]): never[]; unshift(...items: never[]): number; indexOf(searchElement: never, fromIndex?: number): number; lastIndexOf(searchElement: never, fromIndex?: number): number; every(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): this is []; every(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; some(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: never, index: number, array: never[]) => void, thisArg?: any): void; map(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any): []; filter(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): never[]; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduce(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduceRight(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; } >[] : [] >{} : {} ({...([])} = {}); >({...([])} = {}) : {} >{...([])} = {} : {} ->{...([])} : { [n: number]: never; length: 0; toString(): string; toLocaleString(): string; pop(): never; push(...items: never[]): number; concat(...items: ConcatArray[]): never[]; concat(...items: ConcatArray[]): never[]; join(separator?: string): string; reverse(): never[]; shift(): never; slice(start?: number, end?: number): never[]; sort(compareFn?: (a: never, b: never) => number): []; splice(start: number, deleteCount?: number): never[]; splice(start: number, deleteCount: number, ...items: never[]): never[]; unshift(...items: never[]): number; indexOf(searchElement: never, fromIndex?: number): number; lastIndexOf(searchElement: never, fromIndex?: number): number; every(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): this is S[]; every(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; some(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: never, index: number, array: never[]) => void, thisArg?: any): void; map(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any): U[]; filter(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): never[]; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduce(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduceRight(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; } +>{...([])} : { [n: number]: never; length: 0; toString(): string; toLocaleString(): string; pop(): never; push(...items: never[]): number; concat(...items: ConcatArray[]): never[]; concat(...items: ConcatArray[]): never[]; join(separator?: string): string; reverse(): never[]; shift(): never; slice(start?: number, end?: number): never[]; sort(compareFn?: (a: never, b: never) => number): []; splice(start: number, deleteCount?: number): never[]; splice(start: number, deleteCount: number, ...items: never[]): never[]; unshift(...items: never[]): number; indexOf(searchElement: never, fromIndex?: number): number; lastIndexOf(searchElement: never, fromIndex?: number): number; every(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): this is []; every(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; some(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): boolean; forEach(callbackfn: (value: never, index: number, array: never[]) => void, thisArg?: any): void; map(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any): []; filter(predicate: (value: never, index: number, array: never[]) => value is S, thisArg?: any): S[]; filter(predicate: (value: never, index: number, array: never[]) => unknown, thisArg?: any): never[]; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduce(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduce(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never): never; reduceRight(callbackfn: (previousValue: never, currentValue: never, currentIndex: number, array: never[]) => never, initialValue: never): never; reduceRight(callbackfn: (previousValue: U, currentValue: never, currentIndex: number, array: never[]) => U, initialValue: U): U; } >([]) : [] >[] : [] >{} : {} diff --git a/tests/baselines/reference/thisIndexOnExistingReadonlyFieldIsNotNever.types b/tests/baselines/reference/thisIndexOnExistingReadonlyFieldIsNotNever.types index 8f1eff831e305..3b16a4f17ae8a 100644 --- a/tests/baselines/reference/thisIndexOnExistingReadonlyFieldIsNotNever.types +++ b/tests/baselines/reference/thisIndexOnExistingReadonlyFieldIsNotNever.types @@ -35,15 +35,15 @@ class CoachMarkAnchorDecorator { >anchor : AnchorType

const anchorRef = this.props.anchorRef; ->anchorRef : (CoachMarkAnchorProps> & P)["anchorRef"] | undefined ->this.props.anchorRef : (CoachMarkAnchorProps> & P)["anchorRef"] | undefined ->this.props : Readonly<{ children?: unknown; }> & Readonly> & P> +>anchorRef : ((anchor: AnchorType

) => void) | undefined +>this.props.anchorRef : ((anchor: AnchorType

) => void) | undefined +>this.props : Readonly<{ children?: unknown; }> & Readonly>> & Readonly

>this : this ->props : Readonly<{ children?: unknown; }> & Readonly> & P> ->anchorRef : (CoachMarkAnchorProps> & P)["anchorRef"] | undefined +>props : Readonly<{ children?: unknown; }> & Readonly>> & Readonly

+>anchorRef : ((anchor: AnchorType

) => void) | undefined if (anchorRef) { ->anchorRef : (CoachMarkAnchorProps> & P)["anchorRef"] | undefined +>anchorRef : ((anchor: AnchorType

) => void) | undefined anchorRef(anchor); >anchorRef(anchor) : void diff --git a/tests/cases/compiler/implementArrayInterface.ts b/tests/cases/compiler/implementArrayInterface.ts index 79ba68bdc4279..536c1ef572e95 100644 --- a/tests/cases/compiler/implementArrayInterface.ts +++ b/tests/cases/compiler/implementArrayInterface.ts @@ -19,7 +19,7 @@ declare class MyArray implements Array { every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; diff --git a/tests/cases/compiler/mapOnTupleTypes01.ts b/tests/cases/compiler/mapOnTupleTypes01.ts index 0a6ee2bda6a17..583090c644847 100644 --- a/tests/cases/compiler/mapOnTupleTypes01.ts +++ b/tests/cases/compiler/mapOnTupleTypes01.ts @@ -42,4 +42,4 @@ export let g = numNumNumNumNum.map(n => n * n); let numNumNumNumNumNum: [number, number, number, number, number, number] = [1, 2, 3, 4, 5, 6]; -export let h = numNumNumNumNum.map(n => n * n); \ No newline at end of file +export let h = numNumNumNumNumNum.map(n => n * n); \ No newline at end of file diff --git a/tests/cases/compiler/mappedArrayLikeType.ts b/tests/cases/compiler/mappedArrayLikeType.ts new file mode 100644 index 0000000000000..c75d333aeb8a5 --- /dev/null +++ b/tests/cases/compiler/mappedArrayLikeType.ts @@ -0,0 +1,46 @@ +type Tuple = [T, ...string[], T]; +type ReadonlyTuple = readonly [T, ...string[], T]; + +type Mapper = { [P in keyof T]: `${P}_${T[P]}` }; + +type A = string[] & { foo }; +type AMapped = Mapper; + +type RA = readonly string[] & { foo }; +type RAMapped = Mapper; + +type T = [number, ...string[], number] & { foo }; +type TMapped = Mapper; + +type RT = readonly [number, ...string[], number] & { foo }; +type RTMapped = Mapper; + +interface AX extends AY { + 0: T & {}; + length: 1; + foo: Mapper; +} +interface AY extends AZ { bar } +interface AZ extends Array { baz } + +interface RAX extends RAY { + 0: T & {}; + length: 1; + foo: Mapper; +} +interface RAY extends RAZ { bar } +interface RAZ extends ReadonlyArray { baz } + +interface TX extends TY { + 0: T & {}; + foo: Mapper; +} +interface TY extends TZ { bar } +interface TZ extends Tuple { baz } + +interface RTX extends RTY { + 0: T & {}; + foo: Mapper; +} +interface RTY extends RTZ { bar } +interface RTZ extends ReadonlyTuple { baz } From 6ba2d87876989905fa2f9328cf066486eee7fc68 Mon Sep 17 00:00:00 2001 From: graphemecluster Date: Tue, 26 Jul 2022 08:53:41 +0800 Subject: [PATCH 2/2] Bug Fix --- src/harness/fourslashInterfaceImpl.ts | 1 + src/lib/es5.d.ts | 13 ++++-- .../reference/implementArrayInterface.js | 2 +- .../reference/implementArrayInterface.symbols | 8 ++-- .../reference/implementArrayInterface.types | 4 +- .../reference/parserRealSource12.errors.txt | 40 +++++++++---------- .../reference/parserRealSource13.errors.txt | 40 +++++++++---------- .../reference/parserRealSource5.errors.txt | 16 ++++---- .../reference/parserRealSource6.errors.txt | 4 +- .../reference/parserRealSource7.errors.txt | 4 +- .../reference/parserRealSource8.errors.txt | 4 +- .../cases/compiler/implementArrayInterface.ts | 2 +- 12 files changed, 73 insertions(+), 65 deletions(-) diff --git a/src/harness/fourslashInterfaceImpl.ts b/src/harness/fourslashInterfaceImpl.ts index ddb8c02c69c17..c65e8fc06c0bc 100644 --- a/src/harness/fourslashInterfaceImpl.ts +++ b/src/harness/fourslashInterfaceImpl.ts @@ -1172,6 +1172,7 @@ namespace FourSlashInterface { typeEntry("Record"), typeEntry("Exclude"), typeEntry("Extract"), + typeEntry("Cast"), typeEntry("Omit"), typeEntry("NonNullable"), typeEntry("Parameters"), diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index 42610660dd061..124f8b4ba59f4 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -1184,7 +1184,7 @@ interface ReadonlyArray { * @param thisArg An object to which the this keyword can refer in the predicate function. * If thisArg is omitted, undefined is used as the this value. */ - every(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is { [P in keyof this]: S }; + every(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is Cast<{ [P in keyof this]: S }, readonly S[]>; /** * Determines whether all the members of an array satisfy the specified test. * @param predicate A function that accepts up to three arguments. The every method calls @@ -1214,7 +1214,7 @@ interface ReadonlyArray { * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ - map(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): { -readonly [P in keyof this]: U }; + map(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): Cast<{ -readonly [P in keyof this]: U }, U[]>; /** * Returns the elements of an array that meet the condition specified in a callback function. * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array. @@ -1375,7 +1375,7 @@ interface Array { * @param thisArg An object to which the this keyword can refer in the predicate function. * If thisArg is omitted, undefined is used as the this value. */ - every(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is { [P in keyof this]: S }; + every(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is Cast<{ [P in keyof this]: S }, S[]>; /** * Determines whether all the members of an array satisfy the specified test. * @param predicate A function that accepts up to three arguments. The every method calls @@ -1405,7 +1405,7 @@ interface Array { * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): Cast<{ [P in keyof this]: U }, U[]>; /** * Returns the elements of an array that meet the condition specified in a callback function. * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array. @@ -1568,6 +1568,11 @@ type Exclude = T extends U ? never : T; */ type Extract = T extends U ? T : never; +/** + * Make sure T is at least assignable to U + */ +type Cast = T extends U ? T : U; + /** * Construct a type with the properties of T except for those in type K. */ diff --git a/tests/baselines/reference/implementArrayInterface.js b/tests/baselines/reference/implementArrayInterface.js index 9331e07bfed7d..b6c053b514fe6 100644 --- a/tests/baselines/reference/implementArrayInterface.js +++ b/tests/baselines/reference/implementArrayInterface.js @@ -20,7 +20,7 @@ declare class MyArray implements Array { every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): Cast<{ [P in keyof this]: U }, U[]>; filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; diff --git a/tests/baselines/reference/implementArrayInterface.symbols b/tests/baselines/reference/implementArrayInterface.symbols index a180ea0fbc7fe..d7572f008a1ac 100644 --- a/tests/baselines/reference/implementArrayInterface.symbols +++ b/tests/baselines/reference/implementArrayInterface.symbols @@ -120,7 +120,7 @@ declare class MyArray implements Array { >T : Symbol(T, Decl(implementArrayInterface.ts, 0, 22)) >thisArg : Symbol(thisArg, Decl(implementArrayInterface.ts, 20, 70)) - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): Cast<{ [P in keyof this]: U }, U[]>; >map : Symbol(MyArray.map, Decl(implementArrayInterface.ts, 20, 92)) >U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) >callbackfn : Symbol(callbackfn, Decl(implementArrayInterface.ts, 21, 11)) @@ -131,11 +131,13 @@ declare class MyArray implements Array { >T : Symbol(T, Decl(implementArrayInterface.ts, 0, 22)) >U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) >thisArg : Symbol(thisArg, Decl(implementArrayInterface.ts, 21, 66)) ->P : Symbol(P, Decl(implementArrayInterface.ts, 21, 86)) +>Cast : Symbol(Cast, Decl(lib.es5.d.ts, --, --)) +>P : Symbol(P, Decl(implementArrayInterface.ts, 21, 91)) +>U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) >U : Symbol(U, Decl(implementArrayInterface.ts, 21, 8)) filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; ->filter : Symbol(MyArray.filter, Decl(implementArrayInterface.ts, 21, 108)) +>filter : Symbol(MyArray.filter, Decl(implementArrayInterface.ts, 21, 119)) >callbackfn : Symbol(callbackfn, Decl(implementArrayInterface.ts, 22, 11)) >value : Symbol(value, Decl(implementArrayInterface.ts, 22, 24)) >T : Symbol(T, Decl(implementArrayInterface.ts, 0, 22)) diff --git a/tests/baselines/reference/implementArrayInterface.types b/tests/baselines/reference/implementArrayInterface.types index 960ccafa5a376..a1c93cc3a42ab 100644 --- a/tests/baselines/reference/implementArrayInterface.types +++ b/tests/baselines/reference/implementArrayInterface.types @@ -92,8 +92,8 @@ declare class MyArray implements Array { >array : T[] >thisArg : any - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; ->map : (callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any) => { [P in keyof this]: U; } + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): Cast<{ [P in keyof this]: U }, U[]>; +>map : (callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any) => Cast<{ [P in keyof this]: U; }, U[]> >callbackfn : (value: T, index: number, array: T[]) => U >value : T >index : number diff --git a/tests/baselines/reference/parserRealSource12.errors.txt b/tests/baselines/reference/parserRealSource12.errors.txt index a1e959d38ccd3..008bcd120bc22 100644 --- a/tests/baselines/reference/parserRealSource12.errors.txt +++ b/tests/baselines/reference/parserRealSource12.errors.txt @@ -1,14 +1,14 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(4,21): error TS6053: File 'tests/cases/conformance/parser/ecmascript5/typescript.ts' not found. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(8,19): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(8,32): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(8,38): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(25,15): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(25,28): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(25,54): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(29,18): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(29,31): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(41,26): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(41,39): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(8,19): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(8,32): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(8,38): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(25,15): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(25,28): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(25,54): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(29,18): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(29,31): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(41,26): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(41,39): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(41,45): error TS2304: Cannot find name 'AST'. tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(77,26): error TS2304: Cannot find name 'AST'. tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(77,119): error TS2304: Cannot find name 'AST'. @@ -221,11 +221,11 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(524,30): error export interface IAstWalker { walk(ast: AST, parent: AST): AST; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? options: AstWalkOptions; state: any; // user state object } @@ -244,19 +244,19 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(524,30): error export interface IAstWalkCallback { (ast: AST, parent: AST, walker: IAstWalker): AST; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? } export interface IAstWalkChildren { (preAst: AST, parent: AST, walker: IAstWalker): void; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? } class AstWalker implements IAstWalker { @@ -270,9 +270,9 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource12.ts(524,30): error public walk(ast: AST, parent: AST): AST { ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ !!! error TS2304: Cannot find name 'AST'. var preAst = this.pre(ast, parent, this); diff --git a/tests/baselines/reference/parserRealSource13.errors.txt b/tests/baselines/reference/parserRealSource13.errors.txt index a77c57624053b..5d9bd72e78e00 100644 --- a/tests/baselines/reference/parserRealSource13.errors.txt +++ b/tests/baselines/reference/parserRealSource13.errors.txt @@ -1,14 +1,14 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(4,21): error TS6053: File 'tests/cases/conformance/parser/ecmascript5/typescript.ts' not found. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(8,35): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(9,39): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(10,34): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(11,35): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(12,34): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(13,35): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(14,37): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(15,35): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(16,34): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(17,38): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(8,35): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(9,39): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(10,34): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(11,35): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(12,34): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(13,35): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(14,37): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(15,35): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(16,34): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(17,38): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(18,39): error TS2304: Cannot find name 'AST'. tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(19,34): error TS2304: Cannot find name 'AST'. tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(20,35): error TS2304: Cannot find name 'AST'. @@ -128,34 +128,34 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource13.ts(135,36): error export interface AstWalkerDetailCallback { EmptyCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? EmptyExprCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? TrueCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? FalseCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ThisCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? SuperCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? QStringCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? RegexCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? NullCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ArrayLitCallback? (pre, ast: AST): boolean; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ObjectLitCallback? (pre, ast: AST): boolean; ~~~ !!! error TS2304: Cannot find name 'AST'. diff --git a/tests/baselines/reference/parserRealSource5.errors.txt b/tests/baselines/reference/parserRealSource5.errors.txt index c3f9c9f3115d1..a3579322006e7 100644 --- a/tests/baselines/reference/parserRealSource5.errors.txt +++ b/tests/baselines/reference/parserRealSource5.errors.txt @@ -1,11 +1,11 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(4,21): error TS6053: File 'tests/cases/conformance/parser/ecmascript5/typescript.ts' not found. tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(14,66): error TS2304: Cannot find name 'Parser'. tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(27,17): error TS2304: Cannot find name 'CompilerDiagnostics'. -tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(52,38): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(52,51): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(52,38): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(52,51): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(52,64): error TS2304: Cannot find name 'IAstWalker'. -tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,39): error TS2304: Cannot find name 'AST'. -tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,52): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,39): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? +tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,52): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,65): error TS2304: Cannot find name 'IAstWalker'. @@ -69,9 +69,9 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,65): error TS export function prePrintAST(ast: AST, parent: AST, walker: IAstWalker) { ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~~~~~~~~ !!! error TS2304: Cannot find name 'IAstWalker'. var pc: PrintContext = walker.state; @@ -84,9 +84,9 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource5.ts(61,65): error TS export function postPrintAST(ast: AST, parent: AST, walker: IAstWalker) { ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~~~~~~~~ !!! error TS2304: Cannot find name 'IAstWalker'. var pc: PrintContext = walker.state; diff --git a/tests/baselines/reference/parserRealSource6.errors.txt b/tests/baselines/reference/parserRealSource6.errors.txt index 36902234cdd80..944344447c9ee 100644 --- a/tests/baselines/reference/parserRealSource6.errors.txt +++ b/tests/baselines/reference/parserRealSource6.errors.txt @@ -3,7 +3,7 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(8,24): error TS2 tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(10,41): error TS2304: Cannot find name 'ScopeChain'. tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(10,69): error TS2304: Cannot find name 'TypeChecker'. tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(15,22): error TS2304: Cannot find name 'Type'. -tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(16,21): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(16,21): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(17,23): error TS2304: Cannot find name 'SymbolScope'. tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(18,30): error TS2304: Cannot find name 'AstWalkOptions'. tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(20,35): error TS2304: Cannot find name 'TypeFlow'. @@ -88,7 +88,7 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource6.ts(215,20): error T !!! error TS2304: Cannot find name 'Type'. public ast: AST = null; ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? public scope: SymbolScope; ~~~~~~~~~~~ !!! error TS2304: Cannot find name 'SymbolScope'. diff --git a/tests/baselines/reference/parserRealSource7.errors.txt b/tests/baselines/reference/parserRealSource7.errors.txt index a6dd2559d73f1..c2e5a1d378de1 100644 --- a/tests/baselines/reference/parserRealSource7.errors.txt +++ b/tests/baselines/reference/parserRealSource7.errors.txt @@ -7,7 +7,7 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(21,36): error TS tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(29,29): error TS2304: Cannot find name 'Type'. tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(29,45): error TS2552: Cannot find name 'TypeDeclaration'. Did you mean 'CSSStyleDeclaration'? tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(34,43): error TS2304: Cannot find name 'Type'. -tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(34,54): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(34,54): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(34,68): error TS2304: Cannot find name 'TypeCollectionContext'. tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(35,25): error TS2304: Cannot find name 'ValueLocation'. tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(36,30): error TS2304: Cannot find name 'TypeLink'. @@ -361,7 +361,7 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource7.ts(828,13): error T ~~~~ !!! error TS2304: Cannot find name 'Type'. ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? ~~~~~~~~~~~~~~~~~~~~~ !!! error TS2304: Cannot find name 'TypeCollectionContext'. var field = new ValueLocation(); diff --git a/tests/baselines/reference/parserRealSource8.errors.txt b/tests/baselines/reference/parserRealSource8.errors.txt index ca995c1742859..67df23b007877 100644 --- a/tests/baselines/reference/parserRealSource8.errors.txt +++ b/tests/baselines/reference/parserRealSource8.errors.txt @@ -9,7 +9,7 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(19,14): error TS tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(21,25): error TS2304: Cannot find name 'ScopeChain'. tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(33,33): error TS2339: Property 'isInstanceProperty' does not exist on type 'Symbol'. tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(42,18): error TS2339: Property 'isInstanceProperty' does not exist on type 'Symbol'. -tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(69,48): error TS2304: Cannot find name 'AST'. +tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(69,48): error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(70,27): error TS2304: Cannot find name 'ModuleDeclaration'. tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(71,26): error TS2304: Cannot find name 'SymbolTableScope'. tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(72,23): error TS2304: Cannot find name 'SymbolAggregateScope'. @@ -223,7 +223,7 @@ tests/cases/conformance/parser/ecmascript5/parserRealSource8.ts(454,35): error T export function preAssignModuleScopes(ast: AST, context: AssignScopeContext) { ~~~ -!!! error TS2304: Cannot find name 'AST'. +!!! error TS2552: Cannot find name 'AST'. Did you mean 'Cast'? var moduleDecl = ast; ~~~~~~~~~~~~~~~~~ !!! error TS2304: Cannot find name 'ModuleDeclaration'. diff --git a/tests/cases/compiler/implementArrayInterface.ts b/tests/cases/compiler/implementArrayInterface.ts index 536c1ef572e95..ef89d8434b58c 100644 --- a/tests/cases/compiler/implementArrayInterface.ts +++ b/tests/cases/compiler/implementArrayInterface.ts @@ -19,7 +19,7 @@ declare class MyArray implements Array { every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean; forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void; - map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): { [P in keyof this]: U }; + map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): Cast<{ [P in keyof this]: U }, U[]>; filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[]; reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T; reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;