From fe3f88cd08aa18e8cef2c820c0bae801791bfbbc Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Nov 2016 12:14:02 -0800 Subject: [PATCH 1/4] Properly handle identity relation for mapped types --- src/compiler/checker.ts | 66 +++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ae5b71368e21f..766d4c073f7a5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4550,6 +4550,10 @@ namespace ts { unknownType); } + function getErasedTemplateTypeFromMappedType(type: MappedType) { + return instantiateType(getTemplateTypeFromMappedType(type), createUnaryTypeMapper(getTypeParameterFromMappedType(type), anyType)); + } + function isGenericMappedType(type: Type) { if (getObjectFlags(type) & ObjectFlags.Mapped) { const constraintType = getConstraintTypeFromMappedType(type); @@ -7190,29 +7194,18 @@ namespace ts { return result; } } - if (isGenericMappedType(target)) { - // A type [P in S]: X is related to a type [P in T]: Y if T is related to S and X is related to Y. - if (isGenericMappedType(source)) { - if ((result = isRelatedTo(getConstraintTypeFromMappedType(target), getConstraintTypeFromMappedType(source), reportErrors)) && - (result = isRelatedTo(getTemplateTypeFromMappedType(source), getTemplateTypeFromMappedType(target), reportErrors))) { - return result; - } - } - } - else { - // Even if relationship doesn't hold for unions, intersections, or generic type references, - // it may hold in a structural comparison. - const apparentSource = getApparentType(source); - // In a check of the form X = A & B, we will have previously checked if A relates to X or B relates - // to X. Failing both of those we want to check if the aggregation of A and B's members structurally - // relates to X. Thus, we include intersection types on the source side here. - if (apparentSource.flags & (TypeFlags.Object | TypeFlags.Intersection) && target.flags & TypeFlags.Object) { - // Report structural errors only if we haven't reported any errors yet - const reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo && !(source.flags & TypeFlags.Primitive); - if (result = objectTypeRelatedTo(apparentSource, source, target, reportStructuralErrors)) { - errorInfo = saveErrorInfo; - return result; - } + // Even if relationship doesn't hold for unions, intersections, or generic type references, + // it may hold in a structural comparison. + const apparentSource = getApparentType(source); + // In a check of the form X = A & B, we will have previously checked if A relates to X or B relates + // to X. Failing both of those we want to check if the aggregation of A and B's members structurally + // relates to X. Thus, we include intersection types on the source side here. + if (apparentSource.flags & (TypeFlags.Object | TypeFlags.Intersection) && target.flags & TypeFlags.Object) { + // Report structural errors only if we haven't reported any errors yet + const reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo && !(source.flags & TypeFlags.Primitive); + if (result = objectTypeRelatedTo(apparentSource, source, target, reportStructuralErrors)) { + errorInfo = saveErrorInfo; + return result; } } } @@ -7441,6 +7434,9 @@ namespace ts { if (expandingFlags === 3) { result = Ternary.Maybe; } + else if (isGenericMappedType(source) || isGenericMappedType(target)) { + result = mappedTypeRelatedTo(source, target, reportErrors); + } else { result = propertiesRelatedTo(source, target, reportErrors); if (result) { @@ -7472,6 +7468,30 @@ namespace ts { return result; } + // A type [P in S]: X is related to a type [P in T]: Y if T is related to S and X is related to Y. + function mappedTypeRelatedTo(source: Type, target: Type, reportErrors: boolean): Ternary { + if (isGenericMappedType(source) && isGenericMappedType(target)) { + let result: Ternary; + if (relation === identityRelation) { + const readonlyMatches = !(source).declaration.readonlyToken === !(target).declaration.readonlyToken; + const optionalMatches = !(source).declaration.questionToken === !(target).declaration.questionToken; + if (readonlyMatches && optionalMatches) { + if (result = isRelatedTo(getConstraintTypeFromMappedType(target), getConstraintTypeFromMappedType(source), reportErrors)) { + return result & isRelatedTo(getErasedTemplateTypeFromMappedType(source), getErasedTemplateTypeFromMappedType(target), reportErrors); + } + } + } + else { + if (relation === comparableRelation || !(source).declaration.questionToken || (target).declaration.questionToken) { + if (result = isRelatedTo(getConstraintTypeFromMappedType(target), getConstraintTypeFromMappedType(source), reportErrors)) { + return result & isRelatedTo(getTemplateTypeFromMappedType(source), getTemplateTypeFromMappedType(target), reportErrors); + } + } + } + } + return Ternary.False; + } + function propertiesRelatedTo(source: Type, target: Type, reportErrors: boolean): Ternary { if (relation === identityRelation) { return propertiesIdenticalTo(source, target); From d32196ff3640f487c69fffc9e4e8f04e93524cb4 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Nov 2016 12:14:46 -0800 Subject: [PATCH 2/4] Add predefined mapped types and revise Object.freeze --- src/lib/es5.d.ts | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index 2c457a432c6b8..e402a96fade0b 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -180,7 +180,7 @@ interface ObjectConstructor { * Prevents the modification of existing property attributes and values, and prevents the addition of new properties. * @param o Object on which to lock the attributes. */ - freeze(o: T): T; + freeze(o: T): Readonly; /** * Prevents the addition of new properties to an object. @@ -1343,6 +1343,34 @@ interface ArrayLike { readonly [n: number]: T; } +/** + * Make all properties in T optional + */ +type Partial = { + [P in keyof T]?: T[P]; +}; + +/** + * Make all properties in T readonly + */ +type Readonly = { + readonly [P in keyof T]: T[P]; +}; + +/** + * From T pick a set of properties K + */ +type Pick = { + [P in K]: T[P]; +} + +/** + * Construct a type with a set of properties K of type T + */ +type Record = { + [P in K]: T; +} + /** * Represents a raw buffer of binary data, which is used to store data for the * different typed arrays. ArrayBuffers cannot be read from or written to directly, From 04a0f55e96989cb6b9c59b40b4d2d83aab2d506e Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Nov 2016 12:15:11 -0800 Subject: [PATCH 3/4] Revise tests --- .../types/mapped/mappedTypeErrors.ts | 39 +++++++++++-------- .../conformance/types/mapped/mappedTypes2.ts | 23 +++++------ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/tests/cases/conformance/types/mapped/mappedTypeErrors.ts b/tests/cases/conformance/types/mapped/mappedTypeErrors.ts index fce80872185c7..c507bf64a6e10 100644 --- a/tests/cases/conformance/types/mapped/mappedTypeErrors.ts +++ b/tests/cases/conformance/types/mapped/mappedTypeErrors.ts @@ -1,22 +1,6 @@ // @strictNullChecks: true // @declaration: true -type Partial = { - [P in keyof T]?: T[P]; -}; - -type Readonly = { - readonly [P in keyof T]: T[P]; -}; - -type Pick = { - [P in K]: T[P]; -} - -type Record = { - [_ in K]: T; -} - interface Shape { name: string; width: number; @@ -33,6 +17,8 @@ interface Point { y: number; } +// Constraint checking + type T00 = { [P in P]: string }; // Error type T01 = { [P in Date]: number }; // Error type T02 = Record; // Error @@ -59,4 +45,25 @@ function f3(x: T) { function f4(x: T) { let y: Pick; +} + +// Type identity checking + +function f10() { + type K = keyof T; + var x: { [P in keyof T]: T[P] }; + var x: { [Q in keyof T]: T[Q] }; + var x: { [R in K]: T[R] }; +} + +function f11() { + var x: { [P in keyof T]: T[P] }; + var x: { [P in keyof T]?: T[P] }; // Error + var x: { readonly [P in keyof T]: T[P] }; // Error + var x: { readonly [P in keyof T]?: T[P] }; // Error +} + +function f12() { + var x: { [P in keyof T]: T[P] }; + var x: { [P in keyof T]: T[P][] }; // Error } \ No newline at end of file diff --git a/tests/cases/conformance/types/mapped/mappedTypes2.ts b/tests/cases/conformance/types/mapped/mappedTypes2.ts index 84bffe2ea1773..7f5841410e456 100644 --- a/tests/cases/conformance/types/mapped/mappedTypes2.ts +++ b/tests/cases/conformance/types/mapped/mappedTypes2.ts @@ -1,20 +1,15 @@ // @strictNullChecks: true // @declaration: true -type Partial = { - [P in keyof T]?: T[P]; -}; - -type Readonly = { - readonly [P in keyof T]: T[P]; -}; - -type Pick = { - [P in K]: T[P]; -} - -type Record = { - [_ in K]: T; +function verifyLibTypes() { + var x1: Partial; + var x1: { [P in keyof T]?: T[P] }; + var x2: Readonly; + var x2: { readonly [P in keyof T]: T[P] }; + var x3: Pick; + var x3: { [P in K]: T[P] }; + var x4: Record; + var x4: { [P in K]: U }; } type Proxy = { From 997c5862529f2d2406df9faa7c4985ddd91b0421 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Nov 2016 12:15:42 -0800 Subject: [PATCH 4/4] Accept new baselines --- .../reference/mappedTypeErrors.errors.txt | 71 +-- tests/baselines/reference/mappedTypeErrors.js | 70 +-- tests/baselines/reference/mappedTypes2.js | 46 +- .../baselines/reference/mappedTypes2.symbols | 409 +++++++++--------- tests/baselines/reference/mappedTypes2.types | 43 +- 5 files changed, 342 insertions(+), 297 deletions(-) diff --git a/tests/baselines/reference/mappedTypeErrors.errors.txt b/tests/baselines/reference/mappedTypeErrors.errors.txt index 4efcc579ba8ee..0e1198285baa8 100644 --- a/tests/baselines/reference/mappedTypeErrors.errors.txt +++ b/tests/baselines/reference/mappedTypeErrors.errors.txt @@ -1,41 +1,29 @@ -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(34,20): error TS2313: Type parameter 'P' has a circular constraint. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(35,20): error TS2322: Type 'Date' is not assignable to type 'string | number'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(20,20): error TS2313: Type parameter 'P' has a circular constraint. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(21,20): error TS2322: Type 'Date' is not assignable to type 'string | number'. Type 'Date' is not assignable to type 'number'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(36,19): error TS2344: Type 'Date' does not satisfy the constraint 'string | number'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(22,19): error TS2344: Type 'Date' does not satisfy the constraint 'string | number'. Type 'Date' is not assignable to type 'number'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(39,24): error TS2344: Type '"foo"' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(40,24): error TS2344: Type '"name" | "foo"' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(25,24): error TS2344: Type '"foo"' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(26,24): error TS2344: Type '"name" | "foo"' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. Type '"foo"' is not assignable to type '"name" | "width" | "height" | "visible"'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(42,24): error TS2344: Type '"x" | "y"' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(28,24): error TS2344: Type '"x" | "y"' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. Type '"x"' is not assignable to type '"name" | "width" | "height" | "visible"'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(44,24): error TS2344: Type 'undefined' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(47,24): error TS2344: Type 'T' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(30,24): error TS2344: Type 'undefined' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(33,24): error TS2344: Type 'T' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. Type 'T' is not assignable to type '"visible"'. -tests/cases/conformance/types/mapped/mappedTypeErrors.ts(51,24): error TS2344: Type 'T' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(37,24): error TS2344: Type 'T' does not satisfy the constraint '"name" | "width" | "height" | "visible"'. Type 'string | number' is not assignable to type '"name" | "width" | "height" | "visible"'. Type 'string' is not assignable to type '"name" | "width" | "height" | "visible"'. Type 'T' is not assignable to type '"visible"'. Type 'string | number' is not assignable to type '"visible"'. Type 'string' is not assignable to type '"visible"'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(59,9): error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ [P in keyof T]?: T[P]; }'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(60,9): error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ readonly [P in keyof T]: T[P]; }'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(61,9): error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ readonly [P in keyof T]?: T[P]; }'. +tests/cases/conformance/types/mapped/mappedTypeErrors.ts(66,9): error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ [P in keyof T]: T[P][]; }'. -==== tests/cases/conformance/types/mapped/mappedTypeErrors.ts (9 errors) ==== - - type Partial = { - [P in keyof T]?: T[P]; - }; - - type Readonly = { - readonly [P in keyof T]: T[P]; - }; - - type Pick = { - [P in K]: T[P]; - } - - type Record = { - [_ in K]: T; - } +==== tests/cases/conformance/types/mapped/mappedTypeErrors.ts (13 errors) ==== interface Shape { name: string; @@ -53,6 +41,8 @@ tests/cases/conformance/types/mapped/mappedTypeErrors.ts(51,24): error TS2344: T y: number; } + // Constraint checking + type T00 = { [P in P]: string }; // Error ~ !!! error TS2313: Type parameter 'P' has a circular constraint. @@ -107,4 +97,33 @@ tests/cases/conformance/types/mapped/mappedTypeErrors.ts(51,24): error TS2344: T function f4(x: T) { let y: Pick; + } + + // Type identity checking + + function f10() { + type K = keyof T; + var x: { [P in keyof T]: T[P] }; + var x: { [Q in keyof T]: T[Q] }; + var x: { [R in K]: T[R] }; + } + + function f11() { + var x: { [P in keyof T]: T[P] }; + var x: { [P in keyof T]?: T[P] }; // Error + ~ +!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ [P in keyof T]?: T[P]; }'. + var x: { readonly [P in keyof T]: T[P] }; // Error + ~ +!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ readonly [P in keyof T]: T[P]; }'. + var x: { readonly [P in keyof T]?: T[P] }; // Error + ~ +!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ readonly [P in keyof T]?: T[P]; }'. + } + + function f12() { + var x: { [P in keyof T]: T[P] }; + var x: { [P in keyof T]: T[P][] }; // Error + ~ +!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type '{ [P in keyof T]: T[P]; }', but here has type '{ [P in keyof T]: T[P][]; }'. } \ No newline at end of file diff --git a/tests/baselines/reference/mappedTypeErrors.js b/tests/baselines/reference/mappedTypeErrors.js index b2c8dc2e84a2f..fe03b5c959374 100644 --- a/tests/baselines/reference/mappedTypeErrors.js +++ b/tests/baselines/reference/mappedTypeErrors.js @@ -1,21 +1,5 @@ //// [mappedTypeErrors.ts] -type Partial = { - [P in keyof T]?: T[P]; -}; - -type Readonly = { - readonly [P in keyof T]: T[P]; -}; - -type Pick = { - [P in K]: T[P]; -} - -type Record = { - [_ in K]: T; -} - interface Shape { name: string; width: number; @@ -32,6 +16,8 @@ interface Point { y: number; } +// Constraint checking + type T00 = { [P in P]: string }; // Error type T01 = { [P in Date]: number }; // Error type T02 = Record; // Error @@ -58,6 +44,27 @@ function f3(x: T) { function f4(x: T) { let y: Pick; +} + +// Type identity checking + +function f10() { + type K = keyof T; + var x: { [P in keyof T]: T[P] }; + var x: { [Q in keyof T]: T[Q] }; + var x: { [R in K]: T[R] }; +} + +function f11() { + var x: { [P in keyof T]: T[P] }; + var x: { [P in keyof T]?: T[P] }; // Error + var x: { readonly [P in keyof T]: T[P] }; // Error + var x: { readonly [P in keyof T]?: T[P] }; // Error +} + +function f12() { + var x: { [P in keyof T]: T[P] }; + var x: { [P in keyof T]: T[P][] }; // Error } //// [mappedTypeErrors.js] @@ -73,21 +80,25 @@ function f3(x) { function f4(x) { var y; } +// Type identity checking +function f10() { + var x; + var x; + var x; +} +function f11() { + var x; + var x; // Error + var x; // Error + var x; // Error +} +function f12() { + var x; + var x; // Error +} //// [mappedTypeErrors.d.ts] -declare type Partial = { - [P in keyof T]?: T[P]; -}; -declare type Readonly = { - readonly [P in keyof T]: T[P]; -}; -declare type Pick = { - [P in K]: T[P]; -}; -declare type Record = { - [_ in K]: T; -}; interface Shape { name: string; width: number; @@ -119,3 +130,6 @@ declare function f1(x: T): void; declare function f2(x: T): void; declare function f3(x: T): void; declare function f4(x: T): void; +declare function f10(): void; +declare function f11(): void; +declare function f12(): void; diff --git a/tests/baselines/reference/mappedTypes2.js b/tests/baselines/reference/mappedTypes2.js index 8796244c390f7..25bb3fb6ded81 100644 --- a/tests/baselines/reference/mappedTypes2.js +++ b/tests/baselines/reference/mappedTypes2.js @@ -1,19 +1,14 @@ //// [mappedTypes2.ts] -type Partial = { - [P in keyof T]?: T[P]; -}; - -type Readonly = { - readonly [P in keyof T]: T[P]; -}; - -type Pick = { - [P in K]: T[P]; -} - -type Record = { - [_ in K]: T; +function verifyLibTypes() { + var x1: Partial; + var x1: { [P in keyof T]?: T[P] }; + var x2: Readonly; + var x2: { readonly [P in keyof T]: T[P] }; + var x3: Pick; + var x3: { [P in K]: T[P] }; + var x4: Record; + var x4: { [P in K]: U }; } type Proxy = { @@ -95,6 +90,16 @@ function f6(shape: DeepReadonly) { } //// [mappedTypes2.js] +function verifyLibTypes() { + var x1; + var x1; + var x2; + var x2; + var x3; + var x3; + var x4; + var x4; +} function f0(s1, s2) { assign(s1, { name: "circle" }); assign(s2, { width: 10, height: 20 }); @@ -129,18 +134,7 @@ function f6(shape) { //// [mappedTypes2.d.ts] -declare type Partial = { - [P in keyof T]?: T[P]; -}; -declare type Readonly = { - readonly [P in keyof T]: T[P]; -}; -declare type Pick = { - [P in K]: T[P]; -}; -declare type Record = { - [_ in K]: T; -}; +declare function verifyLibTypes(): void; declare type Proxy = { get(): T; set(value: T): void; diff --git a/tests/baselines/reference/mappedTypes2.symbols b/tests/baselines/reference/mappedTypes2.symbols index bc823ed00818c..a610658869e0a 100644 --- a/tests/baselines/reference/mappedTypes2.symbols +++ b/tests/baselines/reference/mappedTypes2.symbols @@ -1,331 +1,340 @@ === tests/cases/conformance/types/mapped/mappedTypes2.ts === -type Partial = { ->Partial : Symbol(Partial, Decl(mappedTypes2.ts, 0, 0)) ->T : Symbol(T, Decl(mappedTypes2.ts, 1, 13)) - - [P in keyof T]?: T[P]; ->P : Symbol(P, Decl(mappedTypes2.ts, 2, 5)) ->T : Symbol(T, Decl(mappedTypes2.ts, 1, 13)) ->T : Symbol(T, Decl(mappedTypes2.ts, 1, 13)) ->P : Symbol(P, Decl(mappedTypes2.ts, 2, 5)) - -}; - -type Readonly = { ->Readonly : Symbol(Readonly, Decl(mappedTypes2.ts, 3, 2)) ->T : Symbol(T, Decl(mappedTypes2.ts, 5, 14)) - - readonly [P in keyof T]: T[P]; ->P : Symbol(P, Decl(mappedTypes2.ts, 6, 14)) ->T : Symbol(T, Decl(mappedTypes2.ts, 5, 14)) ->T : Symbol(T, Decl(mappedTypes2.ts, 5, 14)) ->P : Symbol(P, Decl(mappedTypes2.ts, 6, 14)) - -}; - -type Pick = { ->Pick : Symbol(Pick, Decl(mappedTypes2.ts, 7, 2)) ->T : Symbol(T, Decl(mappedTypes2.ts, 9, 10)) ->K : Symbol(K, Decl(mappedTypes2.ts, 9, 12)) ->T : Symbol(T, Decl(mappedTypes2.ts, 9, 10)) - - [P in K]: T[P]; ->P : Symbol(P, Decl(mappedTypes2.ts, 10, 5)) ->K : Symbol(K, Decl(mappedTypes2.ts, 9, 12)) ->T : Symbol(T, Decl(mappedTypes2.ts, 9, 10)) ->P : Symbol(P, Decl(mappedTypes2.ts, 10, 5)) -} - -type Record = { ->Record : Symbol(Record, Decl(mappedTypes2.ts, 11, 1)) ->K : Symbol(K, Decl(mappedTypes2.ts, 13, 12)) ->T : Symbol(T, Decl(mappedTypes2.ts, 13, 38)) - - [_ in K]: T; ->_ : Symbol(_, Decl(mappedTypes2.ts, 14, 5)) ->K : Symbol(K, Decl(mappedTypes2.ts, 13, 12)) ->T : Symbol(T, Decl(mappedTypes2.ts, 13, 38)) +function verifyLibTypes() { +>verifyLibTypes : Symbol(verifyLibTypes, Decl(mappedTypes2.ts, 0, 0)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>K : Symbol(K, Decl(mappedTypes2.ts, 1, 26)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>U : Symbol(U, Decl(mappedTypes2.ts, 1, 45)) + + var x1: Partial; +>x1 : Symbol(x1, Decl(mappedTypes2.ts, 2, 7), Decl(mappedTypes2.ts, 3, 7)) +>Partial : Symbol(Partial, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) + + var x1: { [P in keyof T]?: T[P] }; +>x1 : Symbol(x1, Decl(mappedTypes2.ts, 2, 7), Decl(mappedTypes2.ts, 3, 7)) +>P : Symbol(P, Decl(mappedTypes2.ts, 3, 15)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>P : Symbol(P, Decl(mappedTypes2.ts, 3, 15)) + + var x2: Readonly; +>x2 : Symbol(x2, Decl(mappedTypes2.ts, 4, 7), Decl(mappedTypes2.ts, 5, 7)) +>Readonly : Symbol(Readonly, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) + + var x2: { readonly [P in keyof T]: T[P] }; +>x2 : Symbol(x2, Decl(mappedTypes2.ts, 4, 7), Decl(mappedTypes2.ts, 5, 7)) +>P : Symbol(P, Decl(mappedTypes2.ts, 5, 24)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>P : Symbol(P, Decl(mappedTypes2.ts, 5, 24)) + + var x3: Pick; +>x3 : Symbol(x3, Decl(mappedTypes2.ts, 6, 7), Decl(mappedTypes2.ts, 7, 7)) +>Pick : Symbol(Pick, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>K : Symbol(K, Decl(mappedTypes2.ts, 1, 26)) + + var x3: { [P in K]: T[P] }; +>x3 : Symbol(x3, Decl(mappedTypes2.ts, 6, 7), Decl(mappedTypes2.ts, 7, 7)) +>P : Symbol(P, Decl(mappedTypes2.ts, 7, 15)) +>K : Symbol(K, Decl(mappedTypes2.ts, 1, 26)) +>T : Symbol(T, Decl(mappedTypes2.ts, 1, 24)) +>P : Symbol(P, Decl(mappedTypes2.ts, 7, 15)) + + var x4: Record; +>x4 : Symbol(x4, Decl(mappedTypes2.ts, 8, 7), Decl(mappedTypes2.ts, 9, 7)) +>Record : Symbol(Record, Decl(lib.d.ts, --, --)) +>K : Symbol(K, Decl(mappedTypes2.ts, 1, 26)) +>U : Symbol(U, Decl(mappedTypes2.ts, 1, 45)) + + var x4: { [P in K]: U }; +>x4 : Symbol(x4, Decl(mappedTypes2.ts, 8, 7), Decl(mappedTypes2.ts, 9, 7)) +>P : Symbol(P, Decl(mappedTypes2.ts, 9, 15)) +>K : Symbol(K, Decl(mappedTypes2.ts, 1, 26)) +>U : Symbol(U, Decl(mappedTypes2.ts, 1, 45)) } type Proxy = { ->Proxy : Symbol(Proxy, Decl(mappedTypes2.ts, 15, 1)) ->T : Symbol(T, Decl(mappedTypes2.ts, 17, 11)) +>Proxy : Symbol(Proxy, Decl(mappedTypes2.ts, 10, 1)) +>T : Symbol(T, Decl(mappedTypes2.ts, 12, 11)) get(): T; ->get : Symbol(get, Decl(mappedTypes2.ts, 17, 17)) ->T : Symbol(T, Decl(mappedTypes2.ts, 17, 11)) +>get : Symbol(get, Decl(mappedTypes2.ts, 12, 17)) +>T : Symbol(T, Decl(mappedTypes2.ts, 12, 11)) set(value: T): void; ->set : Symbol(set, Decl(mappedTypes2.ts, 18, 13)) ->value : Symbol(value, Decl(mappedTypes2.ts, 19, 8)) ->T : Symbol(T, Decl(mappedTypes2.ts, 17, 11)) +>set : Symbol(set, Decl(mappedTypes2.ts, 13, 13)) +>value : Symbol(value, Decl(mappedTypes2.ts, 14, 8)) +>T : Symbol(T, Decl(mappedTypes2.ts, 12, 11)) } type Proxify = { ->Proxify : Symbol(Proxify, Decl(mappedTypes2.ts, 20, 1)) ->T : Symbol(T, Decl(mappedTypes2.ts, 22, 13)) +>Proxify : Symbol(Proxify, Decl(mappedTypes2.ts, 15, 1)) +>T : Symbol(T, Decl(mappedTypes2.ts, 17, 13)) [P in keyof T]: Proxy; ->P : Symbol(P, Decl(mappedTypes2.ts, 23, 5)) ->T : Symbol(T, Decl(mappedTypes2.ts, 22, 13)) ->Proxy : Symbol(Proxy, Decl(mappedTypes2.ts, 15, 1)) ->T : Symbol(T, Decl(mappedTypes2.ts, 22, 13)) ->P : Symbol(P, Decl(mappedTypes2.ts, 23, 5)) +>P : Symbol(P, Decl(mappedTypes2.ts, 18, 5)) +>T : Symbol(T, Decl(mappedTypes2.ts, 17, 13)) +>Proxy : Symbol(Proxy, Decl(mappedTypes2.ts, 10, 1)) +>T : Symbol(T, Decl(mappedTypes2.ts, 17, 13)) +>P : Symbol(P, Decl(mappedTypes2.ts, 18, 5)) } type DeepReadonly = { ->DeepReadonly : Symbol(DeepReadonly, Decl(mappedTypes2.ts, 24, 1)) ->T : Symbol(T, Decl(mappedTypes2.ts, 26, 18)) +>DeepReadonly : Symbol(DeepReadonly, Decl(mappedTypes2.ts, 19, 1)) +>T : Symbol(T, Decl(mappedTypes2.ts, 21, 18)) readonly [P in keyof T]: DeepReadonly; ->P : Symbol(P, Decl(mappedTypes2.ts, 27, 14)) ->T : Symbol(T, Decl(mappedTypes2.ts, 26, 18)) ->DeepReadonly : Symbol(DeepReadonly, Decl(mappedTypes2.ts, 24, 1)) ->T : Symbol(T, Decl(mappedTypes2.ts, 26, 18)) ->P : Symbol(P, Decl(mappedTypes2.ts, 27, 14)) +>P : Symbol(P, Decl(mappedTypes2.ts, 22, 14)) +>T : Symbol(T, Decl(mappedTypes2.ts, 21, 18)) +>DeepReadonly : Symbol(DeepReadonly, Decl(mappedTypes2.ts, 19, 1)) +>T : Symbol(T, Decl(mappedTypes2.ts, 21, 18)) +>P : Symbol(P, Decl(mappedTypes2.ts, 22, 14)) }; declare function assign(obj: T, props: Partial): void; ->assign : Symbol(assign, Decl(mappedTypes2.ts, 28, 2)) ->T : Symbol(T, Decl(mappedTypes2.ts, 30, 24)) ->obj : Symbol(obj, Decl(mappedTypes2.ts, 30, 27)) ->T : Symbol(T, Decl(mappedTypes2.ts, 30, 24)) ->props : Symbol(props, Decl(mappedTypes2.ts, 30, 34)) ->Partial : Symbol(Partial, Decl(mappedTypes2.ts, 0, 0)) ->T : Symbol(T, Decl(mappedTypes2.ts, 30, 24)) +>assign : Symbol(assign, Decl(mappedTypes2.ts, 23, 2)) +>T : Symbol(T, Decl(mappedTypes2.ts, 25, 24)) +>obj : Symbol(obj, Decl(mappedTypes2.ts, 25, 27)) +>T : Symbol(T, Decl(mappedTypes2.ts, 25, 24)) +>props : Symbol(props, Decl(mappedTypes2.ts, 25, 34)) +>Partial : Symbol(Partial, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypes2.ts, 25, 24)) declare function freeze(obj: T): Readonly; ->freeze : Symbol(freeze, Decl(mappedTypes2.ts, 30, 60)) ->T : Symbol(T, Decl(mappedTypes2.ts, 31, 24)) ->obj : Symbol(obj, Decl(mappedTypes2.ts, 31, 27)) ->T : Symbol(T, Decl(mappedTypes2.ts, 31, 24)) ->Readonly : Symbol(Readonly, Decl(mappedTypes2.ts, 3, 2)) ->T : Symbol(T, Decl(mappedTypes2.ts, 31, 24)) +>freeze : Symbol(freeze, Decl(mappedTypes2.ts, 25, 60)) +>T : Symbol(T, Decl(mappedTypes2.ts, 26, 24)) +>obj : Symbol(obj, Decl(mappedTypes2.ts, 26, 27)) +>T : Symbol(T, Decl(mappedTypes2.ts, 26, 24)) +>Readonly : Symbol(Readonly, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypes2.ts, 26, 24)) declare function pick(obj: T, ...keys: K[]): Pick; ->pick : Symbol(pick, Decl(mappedTypes2.ts, 31, 48)) ->T : Symbol(T, Decl(mappedTypes2.ts, 32, 22)) ->K : Symbol(K, Decl(mappedTypes2.ts, 32, 24)) ->T : Symbol(T, Decl(mappedTypes2.ts, 32, 22)) ->obj : Symbol(obj, Decl(mappedTypes2.ts, 32, 44)) ->T : Symbol(T, Decl(mappedTypes2.ts, 32, 22)) ->keys : Symbol(keys, Decl(mappedTypes2.ts, 32, 51)) ->K : Symbol(K, Decl(mappedTypes2.ts, 32, 24)) ->Pick : Symbol(Pick, Decl(mappedTypes2.ts, 7, 2)) ->T : Symbol(T, Decl(mappedTypes2.ts, 32, 22)) ->K : Symbol(K, Decl(mappedTypes2.ts, 32, 24)) +>pick : Symbol(pick, Decl(mappedTypes2.ts, 26, 48)) +>T : Symbol(T, Decl(mappedTypes2.ts, 27, 22)) +>K : Symbol(K, Decl(mappedTypes2.ts, 27, 24)) +>T : Symbol(T, Decl(mappedTypes2.ts, 27, 22)) +>obj : Symbol(obj, Decl(mappedTypes2.ts, 27, 44)) +>T : Symbol(T, Decl(mappedTypes2.ts, 27, 22)) +>keys : Symbol(keys, Decl(mappedTypes2.ts, 27, 51)) +>K : Symbol(K, Decl(mappedTypes2.ts, 27, 24)) +>Pick : Symbol(Pick, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(mappedTypes2.ts, 27, 22)) +>K : Symbol(K, Decl(mappedTypes2.ts, 27, 24)) declare function mapObject(obj: Record, f: (x: T) => U): Record; ->mapObject : Symbol(mapObject, Decl(mappedTypes2.ts, 32, 78)) ->K : Symbol(K, Decl(mappedTypes2.ts, 33, 27)) ->T : Symbol(T, Decl(mappedTypes2.ts, 33, 53)) ->U : Symbol(U, Decl(mappedTypes2.ts, 33, 56)) ->obj : Symbol(obj, Decl(mappedTypes2.ts, 33, 60)) ->Record : Symbol(Record, Decl(mappedTypes2.ts, 11, 1)) ->K : Symbol(K, Decl(mappedTypes2.ts, 33, 27)) ->T : Symbol(T, Decl(mappedTypes2.ts, 33, 53)) ->f : Symbol(f, Decl(mappedTypes2.ts, 33, 78)) ->x : Symbol(x, Decl(mappedTypes2.ts, 33, 83)) ->T : Symbol(T, Decl(mappedTypes2.ts, 33, 53)) ->U : Symbol(U, Decl(mappedTypes2.ts, 33, 56)) ->Record : Symbol(Record, Decl(mappedTypes2.ts, 11, 1)) ->K : Symbol(K, Decl(mappedTypes2.ts, 33, 27)) ->U : Symbol(U, Decl(mappedTypes2.ts, 33, 56)) +>mapObject : Symbol(mapObject, Decl(mappedTypes2.ts, 27, 78)) +>K : Symbol(K, Decl(mappedTypes2.ts, 28, 27)) +>T : Symbol(T, Decl(mappedTypes2.ts, 28, 53)) +>U : Symbol(U, Decl(mappedTypes2.ts, 28, 56)) +>obj : Symbol(obj, Decl(mappedTypes2.ts, 28, 60)) +>Record : Symbol(Record, Decl(lib.d.ts, --, --)) +>K : Symbol(K, Decl(mappedTypes2.ts, 28, 27)) +>T : Symbol(T, Decl(mappedTypes2.ts, 28, 53)) +>f : Symbol(f, Decl(mappedTypes2.ts, 28, 78)) +>x : Symbol(x, Decl(mappedTypes2.ts, 28, 83)) +>T : Symbol(T, Decl(mappedTypes2.ts, 28, 53)) +>U : Symbol(U, Decl(mappedTypes2.ts, 28, 56)) +>Record : Symbol(Record, Decl(lib.d.ts, --, --)) +>K : Symbol(K, Decl(mappedTypes2.ts, 28, 27)) +>U : Symbol(U, Decl(mappedTypes2.ts, 28, 56)) declare function proxify(obj: T): Proxify; ->proxify : Symbol(proxify, Decl(mappedTypes2.ts, 33, 109)) ->T : Symbol(T, Decl(mappedTypes2.ts, 34, 25)) ->obj : Symbol(obj, Decl(mappedTypes2.ts, 34, 28)) ->T : Symbol(T, Decl(mappedTypes2.ts, 34, 25)) ->Proxify : Symbol(Proxify, Decl(mappedTypes2.ts, 20, 1)) ->T : Symbol(T, Decl(mappedTypes2.ts, 34, 25)) +>proxify : Symbol(proxify, Decl(mappedTypes2.ts, 28, 109)) +>T : Symbol(T, Decl(mappedTypes2.ts, 29, 25)) +>obj : Symbol(obj, Decl(mappedTypes2.ts, 29, 28)) +>T : Symbol(T, Decl(mappedTypes2.ts, 29, 25)) +>Proxify : Symbol(Proxify, Decl(mappedTypes2.ts, 15, 1)) +>T : Symbol(T, Decl(mappedTypes2.ts, 29, 25)) interface Shape { ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) name: string; ->name : Symbol(Shape.name, Decl(mappedTypes2.ts, 36, 17)) +>name : Symbol(Shape.name, Decl(mappedTypes2.ts, 31, 17)) width: number; ->width : Symbol(Shape.width, Decl(mappedTypes2.ts, 37, 17)) +>width : Symbol(Shape.width, Decl(mappedTypes2.ts, 32, 17)) height: number; ->height : Symbol(Shape.height, Decl(mappedTypes2.ts, 38, 18)) +>height : Symbol(Shape.height, Decl(mappedTypes2.ts, 33, 18)) visible: boolean; ->visible : Symbol(Shape.visible, Decl(mappedTypes2.ts, 39, 19)) +>visible : Symbol(Shape.visible, Decl(mappedTypes2.ts, 34, 19)) } interface PartialShape { ->PartialShape : Symbol(PartialShape, Decl(mappedTypes2.ts, 41, 1)) +>PartialShape : Symbol(PartialShape, Decl(mappedTypes2.ts, 36, 1)) name?: string; ->name : Symbol(PartialShape.name, Decl(mappedTypes2.ts, 43, 24)) +>name : Symbol(PartialShape.name, Decl(mappedTypes2.ts, 38, 24)) width?: number; ->width : Symbol(PartialShape.width, Decl(mappedTypes2.ts, 44, 18)) +>width : Symbol(PartialShape.width, Decl(mappedTypes2.ts, 39, 18)) height?: number; ->height : Symbol(PartialShape.height, Decl(mappedTypes2.ts, 45, 19)) +>height : Symbol(PartialShape.height, Decl(mappedTypes2.ts, 40, 19)) visible?: boolean; ->visible : Symbol(PartialShape.visible, Decl(mappedTypes2.ts, 46, 20)) +>visible : Symbol(PartialShape.visible, Decl(mappedTypes2.ts, 41, 20)) } interface ReadonlyShape { ->ReadonlyShape : Symbol(ReadonlyShape, Decl(mappedTypes2.ts, 48, 1)) +>ReadonlyShape : Symbol(ReadonlyShape, Decl(mappedTypes2.ts, 43, 1)) readonly name: string; ->name : Symbol(ReadonlyShape.name, Decl(mappedTypes2.ts, 50, 25)) +>name : Symbol(ReadonlyShape.name, Decl(mappedTypes2.ts, 45, 25)) readonly width: number; ->width : Symbol(ReadonlyShape.width, Decl(mappedTypes2.ts, 51, 26)) +>width : Symbol(ReadonlyShape.width, Decl(mappedTypes2.ts, 46, 26)) readonly height: number; ->height : Symbol(ReadonlyShape.height, Decl(mappedTypes2.ts, 52, 27)) +>height : Symbol(ReadonlyShape.height, Decl(mappedTypes2.ts, 47, 27)) readonly visible: boolean; ->visible : Symbol(ReadonlyShape.visible, Decl(mappedTypes2.ts, 53, 28)) +>visible : Symbol(ReadonlyShape.visible, Decl(mappedTypes2.ts, 48, 28)) } function f0(s1: Shape, s2: Shape) { ->f0 : Symbol(f0, Decl(mappedTypes2.ts, 55, 1)) ->s1 : Symbol(s1, Decl(mappedTypes2.ts, 57, 12)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) ->s2 : Symbol(s2, Decl(mappedTypes2.ts, 57, 22)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>f0 : Symbol(f0, Decl(mappedTypes2.ts, 50, 1)) +>s1 : Symbol(s1, Decl(mappedTypes2.ts, 52, 12)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) +>s2 : Symbol(s2, Decl(mappedTypes2.ts, 52, 22)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) assign(s1, { name: "circle" }); ->assign : Symbol(assign, Decl(mappedTypes2.ts, 28, 2)) ->s1 : Symbol(s1, Decl(mappedTypes2.ts, 57, 12)) ->name : Symbol(name, Decl(mappedTypes2.ts, 58, 16)) +>assign : Symbol(assign, Decl(mappedTypes2.ts, 23, 2)) +>s1 : Symbol(s1, Decl(mappedTypes2.ts, 52, 12)) +>name : Symbol(name, Decl(mappedTypes2.ts, 53, 16)) assign(s2, { width: 10, height: 20 }); ->assign : Symbol(assign, Decl(mappedTypes2.ts, 28, 2)) ->s2 : Symbol(s2, Decl(mappedTypes2.ts, 57, 22)) ->width : Symbol(width, Decl(mappedTypes2.ts, 59, 16)) ->height : Symbol(height, Decl(mappedTypes2.ts, 59, 27)) +>assign : Symbol(assign, Decl(mappedTypes2.ts, 23, 2)) +>s2 : Symbol(s2, Decl(mappedTypes2.ts, 52, 22)) +>width : Symbol(width, Decl(mappedTypes2.ts, 54, 16)) +>height : Symbol(height, Decl(mappedTypes2.ts, 54, 27)) } function f1(shape: Shape) { ->f1 : Symbol(f1, Decl(mappedTypes2.ts, 60, 1)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 62, 12)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>f1 : Symbol(f1, Decl(mappedTypes2.ts, 55, 1)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 57, 12)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) var frozen: ReadonlyShape; ->frozen : Symbol(frozen, Decl(mappedTypes2.ts, 63, 7), Decl(mappedTypes2.ts, 64, 7), Decl(mappedTypes2.ts, 65, 7)) ->ReadonlyShape : Symbol(ReadonlyShape, Decl(mappedTypes2.ts, 48, 1)) +>frozen : Symbol(frozen, Decl(mappedTypes2.ts, 58, 7), Decl(mappedTypes2.ts, 59, 7), Decl(mappedTypes2.ts, 60, 7)) +>ReadonlyShape : Symbol(ReadonlyShape, Decl(mappedTypes2.ts, 43, 1)) var frozen: Readonly; ->frozen : Symbol(frozen, Decl(mappedTypes2.ts, 63, 7), Decl(mappedTypes2.ts, 64, 7), Decl(mappedTypes2.ts, 65, 7)) ->Readonly : Symbol(Readonly, Decl(mappedTypes2.ts, 3, 2)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>frozen : Symbol(frozen, Decl(mappedTypes2.ts, 58, 7), Decl(mappedTypes2.ts, 59, 7), Decl(mappedTypes2.ts, 60, 7)) +>Readonly : Symbol(Readonly, Decl(lib.d.ts, --, --)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) var frozen = freeze(shape); ->frozen : Symbol(frozen, Decl(mappedTypes2.ts, 63, 7), Decl(mappedTypes2.ts, 64, 7), Decl(mappedTypes2.ts, 65, 7)) ->freeze : Symbol(freeze, Decl(mappedTypes2.ts, 30, 60)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 62, 12)) +>frozen : Symbol(frozen, Decl(mappedTypes2.ts, 58, 7), Decl(mappedTypes2.ts, 59, 7), Decl(mappedTypes2.ts, 60, 7)) +>freeze : Symbol(freeze, Decl(mappedTypes2.ts, 25, 60)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 57, 12)) } function f2(shape: Shape) { ->f2 : Symbol(f2, Decl(mappedTypes2.ts, 66, 1)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 68, 12)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>f2 : Symbol(f2, Decl(mappedTypes2.ts, 61, 1)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 63, 12)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) var partial: PartialShape; ->partial : Symbol(partial, Decl(mappedTypes2.ts, 69, 7), Decl(mappedTypes2.ts, 70, 7), Decl(mappedTypes2.ts, 71, 7)) ->PartialShape : Symbol(PartialShape, Decl(mappedTypes2.ts, 41, 1)) +>partial : Symbol(partial, Decl(mappedTypes2.ts, 64, 7), Decl(mappedTypes2.ts, 65, 7), Decl(mappedTypes2.ts, 66, 7)) +>PartialShape : Symbol(PartialShape, Decl(mappedTypes2.ts, 36, 1)) var partial: Partial; ->partial : Symbol(partial, Decl(mappedTypes2.ts, 69, 7), Decl(mappedTypes2.ts, 70, 7), Decl(mappedTypes2.ts, 71, 7)) ->Partial : Symbol(Partial, Decl(mappedTypes2.ts, 0, 0)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>partial : Symbol(partial, Decl(mappedTypes2.ts, 64, 7), Decl(mappedTypes2.ts, 65, 7), Decl(mappedTypes2.ts, 66, 7)) +>Partial : Symbol(Partial, Decl(lib.d.ts, --, --)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) var partial: Partial = {}; ->partial : Symbol(partial, Decl(mappedTypes2.ts, 69, 7), Decl(mappedTypes2.ts, 70, 7), Decl(mappedTypes2.ts, 71, 7)) ->Partial : Symbol(Partial, Decl(mappedTypes2.ts, 0, 0)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>partial : Symbol(partial, Decl(mappedTypes2.ts, 64, 7), Decl(mappedTypes2.ts, 65, 7), Decl(mappedTypes2.ts, 66, 7)) +>Partial : Symbol(Partial, Decl(lib.d.ts, --, --)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) } function f3(shape: Shape) { ->f3 : Symbol(f3, Decl(mappedTypes2.ts, 72, 1)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 74, 12)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>f3 : Symbol(f3, Decl(mappedTypes2.ts, 67, 1)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 69, 12)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) const x = pick(shape, "name", "visible"); // { name: string, visible: boolean } ->x : Symbol(x, Decl(mappedTypes2.ts, 75, 9)) ->pick : Symbol(pick, Decl(mappedTypes2.ts, 31, 48)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 74, 12)) +>x : Symbol(x, Decl(mappedTypes2.ts, 70, 9)) +>pick : Symbol(pick, Decl(mappedTypes2.ts, 26, 48)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 69, 12)) } function f4() { ->f4 : Symbol(f4, Decl(mappedTypes2.ts, 76, 1)) +>f4 : Symbol(f4, Decl(mappedTypes2.ts, 71, 1)) const rec = { foo: "hello", bar: "world", baz: "bye" }; ->rec : Symbol(rec, Decl(mappedTypes2.ts, 79, 9)) ->foo : Symbol(foo, Decl(mappedTypes2.ts, 79, 17)) ->bar : Symbol(bar, Decl(mappedTypes2.ts, 79, 31)) ->baz : Symbol(baz, Decl(mappedTypes2.ts, 79, 45)) +>rec : Symbol(rec, Decl(mappedTypes2.ts, 74, 9)) +>foo : Symbol(foo, Decl(mappedTypes2.ts, 74, 17)) +>bar : Symbol(bar, Decl(mappedTypes2.ts, 74, 31)) +>baz : Symbol(baz, Decl(mappedTypes2.ts, 74, 45)) const lengths = mapObject(rec, s => s.length); // { foo: number, bar: number, baz: number } ->lengths : Symbol(lengths, Decl(mappedTypes2.ts, 80, 9)) ->mapObject : Symbol(mapObject, Decl(mappedTypes2.ts, 32, 78)) ->rec : Symbol(rec, Decl(mappedTypes2.ts, 79, 9)) ->s : Symbol(s, Decl(mappedTypes2.ts, 80, 34)) +>lengths : Symbol(lengths, Decl(mappedTypes2.ts, 75, 9)) +>mapObject : Symbol(mapObject, Decl(mappedTypes2.ts, 27, 78)) +>rec : Symbol(rec, Decl(mappedTypes2.ts, 74, 9)) +>s : Symbol(s, Decl(mappedTypes2.ts, 75, 34)) >s.length : Symbol(String.length, Decl(lib.d.ts, --, --)) ->s : Symbol(s, Decl(mappedTypes2.ts, 80, 34)) +>s : Symbol(s, Decl(mappedTypes2.ts, 75, 34)) >length : Symbol(String.length, Decl(lib.d.ts, --, --)) } function f5(shape: Shape) { ->f5 : Symbol(f5, Decl(mappedTypes2.ts, 81, 1)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 83, 12)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>f5 : Symbol(f5, Decl(mappedTypes2.ts, 76, 1)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 78, 12)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) const p = proxify(shape); ->p : Symbol(p, Decl(mappedTypes2.ts, 84, 9)) ->proxify : Symbol(proxify, Decl(mappedTypes2.ts, 33, 109)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 83, 12)) +>p : Symbol(p, Decl(mappedTypes2.ts, 79, 9)) +>proxify : Symbol(proxify, Decl(mappedTypes2.ts, 28, 109)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 78, 12)) let name = p.name.get(); ->name : Symbol(name, Decl(mappedTypes2.ts, 85, 7)) ->p.name.get : Symbol(get, Decl(mappedTypes2.ts, 17, 17)) +>name : Symbol(name, Decl(mappedTypes2.ts, 80, 7)) +>p.name.get : Symbol(get, Decl(mappedTypes2.ts, 12, 17)) >p.name : Symbol(name) ->p : Symbol(p, Decl(mappedTypes2.ts, 84, 9)) +>p : Symbol(p, Decl(mappedTypes2.ts, 79, 9)) >name : Symbol(name) ->get : Symbol(get, Decl(mappedTypes2.ts, 17, 17)) +>get : Symbol(get, Decl(mappedTypes2.ts, 12, 17)) p.visible.set(false); ->p.visible.set : Symbol(set, Decl(mappedTypes2.ts, 18, 13)) +>p.visible.set : Symbol(set, Decl(mappedTypes2.ts, 13, 13)) >p.visible : Symbol(visible) ->p : Symbol(p, Decl(mappedTypes2.ts, 84, 9)) +>p : Symbol(p, Decl(mappedTypes2.ts, 79, 9)) >visible : Symbol(visible) ->set : Symbol(set, Decl(mappedTypes2.ts, 18, 13)) +>set : Symbol(set, Decl(mappedTypes2.ts, 13, 13)) } function f6(shape: DeepReadonly) { ->f6 : Symbol(f6, Decl(mappedTypes2.ts, 87, 1)) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 89, 12)) ->DeepReadonly : Symbol(DeepReadonly, Decl(mappedTypes2.ts, 24, 1)) ->Shape : Symbol(Shape, Decl(mappedTypes2.ts, 34, 48)) +>f6 : Symbol(f6, Decl(mappedTypes2.ts, 82, 1)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 84, 12)) +>DeepReadonly : Symbol(DeepReadonly, Decl(mappedTypes2.ts, 19, 1)) +>Shape : Symbol(Shape, Decl(mappedTypes2.ts, 29, 48)) let name = shape.name; // DeepReadonly ->name : Symbol(name, Decl(mappedTypes2.ts, 90, 7)) +>name : Symbol(name, Decl(mappedTypes2.ts, 85, 7)) >shape.name : Symbol(name) ->shape : Symbol(shape, Decl(mappedTypes2.ts, 89, 12)) +>shape : Symbol(shape, Decl(mappedTypes2.ts, 84, 12)) >name : Symbol(name) let length = name.length; // DeepReadonly ->length : Symbol(length, Decl(mappedTypes2.ts, 91, 7)) +>length : Symbol(length, Decl(mappedTypes2.ts, 86, 7)) >name.length : Symbol(length) ->name : Symbol(name, Decl(mappedTypes2.ts, 90, 7)) +>name : Symbol(name, Decl(mappedTypes2.ts, 85, 7)) >length : Symbol(length) let toString = length.toString; // DeepReadonly<(radix?: number) => string> ->toString : Symbol(toString, Decl(mappedTypes2.ts, 92, 7)) +>toString : Symbol(toString, Decl(mappedTypes2.ts, 87, 7)) >length.toString : Symbol(toString) ->length : Symbol(length, Decl(mappedTypes2.ts, 91, 7)) +>length : Symbol(length, Decl(mappedTypes2.ts, 86, 7)) >toString : Symbol(toString) } diff --git a/tests/baselines/reference/mappedTypes2.types b/tests/baselines/reference/mappedTypes2.types index e3b6764799319..8c487288a6f22 100644 --- a/tests/baselines/reference/mappedTypes2.types +++ b/tests/baselines/reference/mappedTypes2.types @@ -1,51 +1,60 @@ === tests/cases/conformance/types/mapped/mappedTypes2.ts === -type Partial = { +function verifyLibTypes() { +>verifyLibTypes : () => void +>T : T +>K : K +>T : T +>U : U + + var x1: Partial; +>x1 : Partial >Partial : Partial >T : T - [P in keyof T]?: T[P]; + var x1: { [P in keyof T]?: T[P] }; +>x1 : Partial >P : P >T : T >T : T >P : P -}; - -type Readonly = { + var x2: Readonly; +>x2 : Readonly >Readonly : Readonly >T : T - readonly [P in keyof T]: T[P]; + var x2: { readonly [P in keyof T]: T[P] }; +>x2 : Readonly >P : P >T : T >T : T >P : P -}; - -type Pick = { + var x3: Pick; +>x3 : Pick >Pick : Pick >T : T >K : K ->T : T - [P in K]: T[P]; + var x3: { [P in K]: T[P] }; +>x3 : Pick >P : P >K : K >T : T >P : P -} -type Record = { + var x4: Record; +>x4 : Record >Record : Record >K : K ->T : T +>U : U - [_ in K]: T; ->_ : _ + var x4: { [P in K]: U }; +>x4 : Record +>P : P >K : K ->T : T +>U : U } type Proxy = {