From a4a73df839cc6c7ed5f68aad69002ee5c03ab5e3 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Sun, 27 May 2018 15:44:08 -0700 Subject: [PATCH] Accept new baselines --- tests/baselines/reference/mappedTypes4.types | 12 +- .../reference/unknownType1.errors.txt | 109 +++++-- tests/baselines/reference/unknownType1.js | 107 +++++-- .../baselines/reference/unknownType1.symbols | 285 +++++++++++------- tests/baselines/reference/unknownType1.types | 140 ++++++--- 5 files changed, 447 insertions(+), 206 deletions(-) diff --git a/tests/baselines/reference/mappedTypes4.types b/tests/baselines/reference/mappedTypes4.types index 8a5b6af5319..7292e143b42 100644 --- a/tests/baselines/reference/mappedTypes4.types +++ b/tests/baselines/reference/mappedTypes4.types @@ -41,17 +41,17 @@ function boxify(obj: T): Boxified { for (let k in obj) { >k : Extract ->obj : T & object +>obj : T result[k] = { value: obj[k] }; ->result[k] = { value: obj[k] } : { value: (T & object)[Extract]; } +>result[k] = { value: obj[k] } : { value: T[Extract]; } >result[k] : Boxified[Extract] >result : Boxified >k : Extract ->{ value: obj[k] } : { value: (T & object)[Extract]; } ->value : (T & object)[Extract] ->obj[k] : (T & object)[Extract] ->obj : T & object +>{ value: obj[k] } : { value: T[Extract]; } +>value : T[Extract] +>obj[k] : T[Extract] +>obj : T >k : Extract } return result; diff --git a/tests/baselines/reference/unknownType1.errors.txt b/tests/baselines/reference/unknownType1.errors.txt index a2118726b8b..26030e13831 100644 --- a/tests/baselines/reference/unknownType1.errors.txt +++ b/tests/baselines/reference/unknownType1.errors.txt @@ -1,15 +1,28 @@ -tests/cases/conformance/types/unknown/unknownType1.ts(87,9): error TS2322: Type 'unknown' is not assignable to type 'object'. -tests/cases/conformance/types/unknown/unknownType1.ts(88,9): error TS2322: Type 'unknown' is not assignable to type 'string'. -tests/cases/conformance/types/unknown/unknownType1.ts(89,9): error TS2322: Type 'unknown' is not assignable to type 'string[]'. -tests/cases/conformance/types/unknown/unknownType1.ts(90,9): error TS2322: Type 'unknown' is not assignable to type '{}'. -tests/cases/conformance/types/unknown/unknownType1.ts(91,9): error TS2322: Type 'unknown' is not assignable to type '{} | null | undefined'. +tests/cases/conformance/types/unknown/unknownType1.ts(45,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(46,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(47,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(48,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(49,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(50,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(51,6): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(52,6): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(58,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(59,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(60,5): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(61,9): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/types/unknown/unknownType1.ts(105,9): error TS2322: Type 'unknown' is not assignable to type 'object'. +tests/cases/conformance/types/unknown/unknownType1.ts(106,9): error TS2322: Type 'unknown' is not assignable to type 'string'. +tests/cases/conformance/types/unknown/unknownType1.ts(107,9): error TS2322: Type 'unknown' is not assignable to type 'string[]'. +tests/cases/conformance/types/unknown/unknownType1.ts(108,9): error TS2322: Type 'unknown' is not assignable to type '{}'. +tests/cases/conformance/types/unknown/unknownType1.ts(109,9): error TS2322: Type 'unknown' is not assignable to type '{} | null | undefined'. Type 'unknown' is not assignable to type '{}'. -tests/cases/conformance/types/unknown/unknownType1.ts(97,9): error TS2322: Type 'T' is not assignable to type 'object'. -tests/cases/conformance/types/unknown/unknownType1.ts(106,5): error TS2322: Type '123' is not assignable to type '{ [x: string]: unknown; }'. -tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor. +tests/cases/conformance/types/unknown/unknownType1.ts(115,9): error TS2322: Type 'T' is not assignable to type 'object'. +tests/cases/conformance/types/unknown/unknownType1.ts(124,5): error TS2322: Type '123' is not assignable to type '{ [x: string]: unknown; }'. +tests/cases/conformance/types/unknown/unknownType1.ts(150,14): error TS2700: Rest types may only be created from object types. +tests/cases/conformance/types/unknown/unknownType1.ts(156,5): error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor. -==== tests/cases/conformance/types/unknown/unknownType1.ts (8 errors) ==== +==== tests/cases/conformance/types/unknown/unknownType1.ts (21 errors) ==== // In an intersection everything absorbs unknown type T00 = unknown & null; // null @@ -49,20 +62,62 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop type T40 = keyof any; // string | number | symbol type T41 = keyof unknown; // string | number | symbol + // Only equality operators are allowed with unknown + + function f10(x: unknown) { + x == 5; + x !== 10; + x >= 0; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x.foo; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x[10]; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x(); // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x + 1; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x * 2; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + -x; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + +x; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + } + + // No property accesses, element accesses, or function calls + + function f11(x: unknown) { + x.foo; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x[5]; // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + x(); // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + new x(); // Error + ~ +!!! error TS2571: Object is of type 'unknown'. + } + // typeof, instanceof, and user defined type predicates declare function isFunction(x: unknown): x is Function; - function f1(x: unknown) { + function f20(x: unknown) { if (typeof x === "string" || typeof x === "number") { x; // string | number } - if (typeof x === "object") { - x; // object - } - if (typeof x === "function") { - x; // object - } if (x instanceof Error) { x; // Error } @@ -79,7 +134,7 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop // Anything is assignable to unknown - function f2(pAny: any, pNever: never, pT: T) { + function f21(pAny: any, pNever: never, pT: T) { let x: unknown; x = 123; x = "hello"; @@ -93,7 +148,7 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop // unknown assignable only to itself and any - function f3(x: unknown) { + function f22(x: unknown) { let v1: any = x; let v2: unknown = x; let v3: object = x; // Error @@ -116,7 +171,7 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop // Type parameter 'T extends unknown' not related to object - function f4(x: T) { + function f23(x: T) { let y: object = x; // Error ~ !!! error TS2322: Type 'T' is not assignable to type 'object'. @@ -124,7 +179,7 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop // Anything but primitive assignable to { [x: string]: unknown } - function f5(x: { [x: string]: unknown }) { + function f24(x: { [x: string]: unknown }) { x = {}; x = { a: 5 }; x = [1, 2, 3]; @@ -135,14 +190,14 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop // Locals of type unknown always considered initialized - function f6() { + function f25() { let x: unknown; let y = x; } // Spread of unknown causes result to be unknown - function f7(x: {}, y: unknown, z: any) { + function f26(x: {}, y: unknown, z: any) { let o1 = { a: 42, ...x }; // { a: number } let o2 = { a: 42, ...x, ...y }; // unknown let o3 = { a: 42, ...x, ...y, ...z }; // any @@ -150,7 +205,15 @@ tests/cases/conformance/types/unknown/unknownType1.ts(132,5): error TS2564: Prop // Functions with unknown return type don't need return expressions - function f8(): unknown { + function f27(): unknown { + } + + // Rest type cannot be created from unknown + + function f28(x: unknown) { + let { ...a } = x; // Error + ~ +!!! error TS2700: Rest types may only be created from object types. } // Class properties of type unknown don't need definite assignment diff --git a/tests/baselines/reference/unknownType1.js b/tests/baselines/reference/unknownType1.js index b722ef2006b..2481f069186 100644 --- a/tests/baselines/reference/unknownType1.js +++ b/tests/baselines/reference/unknownType1.js @@ -38,20 +38,38 @@ type T33 = T extends never ? true : false; // Deferred type T40 = keyof any; // string | number | symbol type T41 = keyof unknown; // string | number | symbol +// Only equality operators are allowed with unknown + +function f10(x: unknown) { + x == 5; + x !== 10; + x >= 0; // Error + x.foo; // Error + x[10]; // Error + x(); // Error + x + 1; // Error + x * 2; // Error + -x; // Error + +x; // Error +} + +// No property accesses, element accesses, or function calls + +function f11(x: unknown) { + x.foo; // Error + x[5]; // Error + x(); // Error + new x(); // Error +} + // typeof, instanceof, and user defined type predicates declare function isFunction(x: unknown): x is Function; -function f1(x: unknown) { +function f20(x: unknown) { if (typeof x === "string" || typeof x === "number") { x; // string | number } - if (typeof x === "object") { - x; // object - } - if (typeof x === "function") { - x; // object - } if (x instanceof Error) { x; // Error } @@ -68,7 +86,7 @@ type T52 = T50; // { [x: string]: number } // Anything is assignable to unknown -function f2(pAny: any, pNever: never, pT: T) { +function f21(pAny: any, pNever: never, pT: T) { let x: unknown; x = 123; x = "hello"; @@ -82,7 +100,7 @@ function f2(pAny: any, pNever: never, pT: T) { // unknown assignable only to itself and any -function f3(x: unknown) { +function f22(x: unknown) { let v1: any = x; let v2: unknown = x; let v3: object = x; // Error @@ -94,13 +112,13 @@ function f3(x: unknown) { // Type parameter 'T extends unknown' not related to object -function f4(x: T) { +function f23(x: T) { let y: object = x; // Error } // Anything but primitive assignable to { [x: string]: unknown } -function f5(x: { [x: string]: unknown }) { +function f24(x: { [x: string]: unknown }) { x = {}; x = { a: 5 }; x = [1, 2, 3]; @@ -109,14 +127,14 @@ function f5(x: { [x: string]: unknown }) { // Locals of type unknown always considered initialized -function f6() { +function f25() { let x: unknown; let y = x; } // Spread of unknown causes result to be unknown -function f7(x: {}, y: unknown, z: any) { +function f26(x: {}, y: unknown, z: any) { let o1 = { a: 42, ...x }; // { a: number } let o2 = { a: 42, ...x, ...y }; // unknown let o3 = { a: 42, ...x, ...y, ...z }; // any @@ -124,7 +142,13 @@ function f7(x: {}, y: unknown, z: any) { // Functions with unknown return type don't need return expressions -function f8(): unknown { +function f27(): unknown { +} + +// Rest type cannot be created from unknown + +function f28(x: unknown) { + let { ...a } = x; // Error } // Class properties of type unknown don't need definite assignment @@ -147,16 +171,39 @@ var __assign = (this && this.__assign) || Object.assign || function(t) { } return t; }; -function f1(x) { +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +// Only equality operators are allowed with unknown +function f10(x) { + x == 5; + x !== 10; + x >= 0; // Error + x.foo; // Error + x[10]; // Error + x(); // Error + x + 1; // Error + x * 2; // Error + -x; // Error + +x; // Error +} +// No property accesses, element accesses, or function calls +function f11(x) { + x.foo; // Error + x[5]; // Error + x(); // Error + new x(); // Error +} +function f20(x) { if (typeof x === "string" || typeof x === "number") { x; // string | number } - if (typeof x === "object") { - x; // object - } - if (typeof x === "function") { - x; // object - } if (x instanceof Error) { x; // Error } @@ -165,7 +212,7 @@ function f1(x) { } } // Anything is assignable to unknown -function f2(pAny, pNever, pT) { +function f21(pAny, pNever, pT) { var x; x = 123; x = "hello"; @@ -177,7 +224,7 @@ function f2(pAny, pNever, pT) { x = pT; } // unknown assignable only to itself and any -function f3(x) { +function f22(x) { var v1 = x; var v2 = x; var v3 = x; // Error @@ -187,29 +234,33 @@ function f3(x) { var v7 = x; // Error } // Type parameter 'T extends unknown' not related to object -function f4(x) { +function f23(x) { var y = x; // Error } // Anything but primitive assignable to { [x: string]: unknown } -function f5(x) { +function f24(x) { x = {}; x = { a: 5 }; x = [1, 2, 3]; x = 123; // Error } // Locals of type unknown always considered initialized -function f6() { +function f25() { var x; var y = x; } // Spread of unknown causes result to be unknown -function f7(x, y, z) { +function f26(x, y, z) { var o1 = __assign({ a: 42 }, x); // { a: number } var o2 = __assign({ a: 42 }, x, y); // unknown var o3 = __assign({ a: 42 }, x, y, z); // any } // Functions with unknown return type don't need return expressions -function f8() { +function f27() { +} +// Rest type cannot be created from unknown +function f28(x) { + var a = __rest(x, []); // Error } // Class properties of type unknown don't need definite assignment var C1 = /** @class */ (function () { diff --git a/tests/baselines/reference/unknownType1.symbols b/tests/baselines/reference/unknownType1.symbols index 007cae242b3..5c36e3d6626 100644 --- a/tests/baselines/reference/unknownType1.symbols +++ b/tests/baselines/reference/unknownType1.symbols @@ -97,239 +97,294 @@ type T40 = keyof any; // string | number | symbol type T41 = keyof unknown; // string | number | symbol >T41 : Symbol(T41, Decl(unknownType1.ts, 36, 21)) +// Only equality operators are allowed with unknown + +function f10(x: unknown) { +>f10 : Symbol(f10, Decl(unknownType1.ts, 37, 25)) +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x == 5; +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x !== 10; +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x >= 0; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x.foo; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x[10]; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x(); // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x + 1; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + x * 2; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + -x; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) + + +x; // Error +>x : Symbol(x, Decl(unknownType1.ts, 41, 13)) +} + +// No property accesses, element accesses, or function calls + +function f11(x: unknown) { +>f11 : Symbol(f11, Decl(unknownType1.ts, 52, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 56, 13)) + + x.foo; // Error +>x : Symbol(x, Decl(unknownType1.ts, 56, 13)) + + x[5]; // Error +>x : Symbol(x, Decl(unknownType1.ts, 56, 13)) + + x(); // Error +>x : Symbol(x, Decl(unknownType1.ts, 56, 13)) + + new x(); // Error +>x : Symbol(x, Decl(unknownType1.ts, 56, 13)) +} + // typeof, instanceof, and user defined type predicates declare function isFunction(x: unknown): x is Function; ->isFunction : Symbol(isFunction, Decl(unknownType1.ts, 37, 25)) ->x : Symbol(x, Decl(unknownType1.ts, 41, 28)) ->x : Symbol(x, Decl(unknownType1.ts, 41, 28)) +>isFunction : Symbol(isFunction, Decl(unknownType1.ts, 61, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 65, 28)) +>x : Symbol(x, Decl(unknownType1.ts, 65, 28)) >Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) -function f1(x: unknown) { ->f1 : Symbol(f1, Decl(unknownType1.ts, 41, 55)) ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +function f20(x: unknown) { +>f20 : Symbol(f20, Decl(unknownType1.ts, 65, 55)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) if (typeof x === "string" || typeof x === "number") { ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) x; // string | number ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) - } - if (typeof x === "object") { ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) - - x; // object ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) - } - if (typeof x === "function") { ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) - - x; // object ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) } if (x instanceof Error) { ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) >Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) x; // Error ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) } if (isFunction(x)) { ->isFunction : Symbol(isFunction, Decl(unknownType1.ts, 37, 25)) ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +>isFunction : Symbol(isFunction, Decl(unknownType1.ts, 61, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) x; // Function ->x : Symbol(x, Decl(unknownType1.ts, 43, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 67, 13)) } } // Homomorphic mapped type over unknown type T50 = { [P in keyof T]: number }; ->T50 : Symbol(T50, Decl(unknownType1.ts, 59, 1)) ->T : Symbol(T, Decl(unknownType1.ts, 63, 9)) ->P : Symbol(P, Decl(unknownType1.ts, 63, 17)) ->T : Symbol(T, Decl(unknownType1.ts, 63, 9)) +>T50 : Symbol(T50, Decl(unknownType1.ts, 77, 1)) +>T : Symbol(T, Decl(unknownType1.ts, 81, 9)) +>P : Symbol(P, Decl(unknownType1.ts, 81, 17)) +>T : Symbol(T, Decl(unknownType1.ts, 81, 9)) type T51 = T50; // { [x: string]: number } ->T51 : Symbol(T51, Decl(unknownType1.ts, 63, 41)) ->T50 : Symbol(T50, Decl(unknownType1.ts, 59, 1)) +>T51 : Symbol(T51, Decl(unknownType1.ts, 81, 41)) +>T50 : Symbol(T50, Decl(unknownType1.ts, 77, 1)) type T52 = T50; // { [x: string]: number } ->T52 : Symbol(T52, Decl(unknownType1.ts, 64, 24)) ->T50 : Symbol(T50, Decl(unknownType1.ts, 59, 1)) +>T52 : Symbol(T52, Decl(unknownType1.ts, 82, 24)) +>T50 : Symbol(T50, Decl(unknownType1.ts, 77, 1)) // Anything is assignable to unknown -function f2(pAny: any, pNever: never, pT: T) { ->f2 : Symbol(f2, Decl(unknownType1.ts, 65, 20)) ->T : Symbol(T, Decl(unknownType1.ts, 69, 12)) ->pAny : Symbol(pAny, Decl(unknownType1.ts, 69, 15)) ->pNever : Symbol(pNever, Decl(unknownType1.ts, 69, 25)) ->pT : Symbol(pT, Decl(unknownType1.ts, 69, 40)) ->T : Symbol(T, Decl(unknownType1.ts, 69, 12)) +function f21(pAny: any, pNever: never, pT: T) { +>f21 : Symbol(f21, Decl(unknownType1.ts, 83, 20)) +>T : Symbol(T, Decl(unknownType1.ts, 87, 13)) +>pAny : Symbol(pAny, Decl(unknownType1.ts, 87, 16)) +>pNever : Symbol(pNever, Decl(unknownType1.ts, 87, 26)) +>pT : Symbol(pT, Decl(unknownType1.ts, 87, 41)) +>T : Symbol(T, Decl(unknownType1.ts, 87, 13)) let x: unknown; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) x = 123; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) x = "hello"; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) x = [1, 2, 3]; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) x = new Error(); ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) >Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) x = x; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) x = pAny; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) ->pAny : Symbol(pAny, Decl(unknownType1.ts, 69, 15)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) +>pAny : Symbol(pAny, Decl(unknownType1.ts, 87, 16)) x = pNever; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) ->pNever : Symbol(pNever, Decl(unknownType1.ts, 69, 25)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) +>pNever : Symbol(pNever, Decl(unknownType1.ts, 87, 26)) x = pT; ->x : Symbol(x, Decl(unknownType1.ts, 70, 7)) ->pT : Symbol(pT, Decl(unknownType1.ts, 69, 40)) +>x : Symbol(x, Decl(unknownType1.ts, 88, 7)) +>pT : Symbol(pT, Decl(unknownType1.ts, 87, 41)) } // unknown assignable only to itself and any -function f3(x: unknown) { ->f3 : Symbol(f3, Decl(unknownType1.ts, 79, 1)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +function f22(x: unknown) { +>f22 : Symbol(f22, Decl(unknownType1.ts, 97, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v1: any = x; ->v1 : Symbol(v1, Decl(unknownType1.ts, 84, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v1 : Symbol(v1, Decl(unknownType1.ts, 102, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v2: unknown = x; ->v2 : Symbol(v2, Decl(unknownType1.ts, 85, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v2 : Symbol(v2, Decl(unknownType1.ts, 103, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v3: object = x; // Error ->v3 : Symbol(v3, Decl(unknownType1.ts, 86, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v3 : Symbol(v3, Decl(unknownType1.ts, 104, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v4: string = x; // Error ->v4 : Symbol(v4, Decl(unknownType1.ts, 87, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v4 : Symbol(v4, Decl(unknownType1.ts, 105, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v5: string[] = x; // Error ->v5 : Symbol(v5, Decl(unknownType1.ts, 88, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v5 : Symbol(v5, Decl(unknownType1.ts, 106, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v6: {} = x; // Error ->v6 : Symbol(v6, Decl(unknownType1.ts, 89, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v6 : Symbol(v6, Decl(unknownType1.ts, 107, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) let v7: {} | null | undefined = x; // Error ->v7 : Symbol(v7, Decl(unknownType1.ts, 90, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 83, 12)) +>v7 : Symbol(v7, Decl(unknownType1.ts, 108, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 101, 13)) } // Type parameter 'T extends unknown' not related to object -function f4(x: T) { ->f4 : Symbol(f4, Decl(unknownType1.ts, 91, 1)) ->T : Symbol(T, Decl(unknownType1.ts, 95, 12)) ->x : Symbol(x, Decl(unknownType1.ts, 95, 31)) ->T : Symbol(T, Decl(unknownType1.ts, 95, 12)) +function f23(x: T) { +>f23 : Symbol(f23, Decl(unknownType1.ts, 109, 1)) +>T : Symbol(T, Decl(unknownType1.ts, 113, 13)) +>x : Symbol(x, Decl(unknownType1.ts, 113, 32)) +>T : Symbol(T, Decl(unknownType1.ts, 113, 13)) let y: object = x; // Error ->y : Symbol(y, Decl(unknownType1.ts, 96, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 95, 31)) +>y : Symbol(y, Decl(unknownType1.ts, 114, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 113, 32)) } // Anything but primitive assignable to { [x: string]: unknown } -function f5(x: { [x: string]: unknown }) { ->f5 : Symbol(f5, Decl(unknownType1.ts, 97, 1)) ->x : Symbol(x, Decl(unknownType1.ts, 101, 12)) ->x : Symbol(x, Decl(unknownType1.ts, 101, 18)) +function f24(x: { [x: string]: unknown }) { +>f24 : Symbol(f24, Decl(unknownType1.ts, 115, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 119, 13)) +>x : Symbol(x, Decl(unknownType1.ts, 119, 19)) x = {}; ->x : Symbol(x, Decl(unknownType1.ts, 101, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 119, 13)) x = { a: 5 }; ->x : Symbol(x, Decl(unknownType1.ts, 101, 12)) ->a : Symbol(a, Decl(unknownType1.ts, 103, 9)) +>x : Symbol(x, Decl(unknownType1.ts, 119, 13)) +>a : Symbol(a, Decl(unknownType1.ts, 121, 9)) x = [1, 2, 3]; ->x : Symbol(x, Decl(unknownType1.ts, 101, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 119, 13)) x = 123; // Error ->x : Symbol(x, Decl(unknownType1.ts, 101, 12)) +>x : Symbol(x, Decl(unknownType1.ts, 119, 13)) } // Locals of type unknown always considered initialized -function f6() { ->f6 : Symbol(f6, Decl(unknownType1.ts, 106, 1)) +function f25() { +>f25 : Symbol(f25, Decl(unknownType1.ts, 124, 1)) let x: unknown; ->x : Symbol(x, Decl(unknownType1.ts, 111, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 129, 7)) let y = x; ->y : Symbol(y, Decl(unknownType1.ts, 112, 7)) ->x : Symbol(x, Decl(unknownType1.ts, 111, 7)) +>y : Symbol(y, Decl(unknownType1.ts, 130, 7)) +>x : Symbol(x, Decl(unknownType1.ts, 129, 7)) } // Spread of unknown causes result to be unknown -function f7(x: {}, y: unknown, z: any) { ->f7 : Symbol(f7, Decl(unknownType1.ts, 113, 1)) ->x : Symbol(x, Decl(unknownType1.ts, 117, 12)) ->y : Symbol(y, Decl(unknownType1.ts, 117, 18)) ->z : Symbol(z, Decl(unknownType1.ts, 117, 30)) +function f26(x: {}, y: unknown, z: any) { +>f26 : Symbol(f26, Decl(unknownType1.ts, 131, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 135, 13)) +>y : Symbol(y, Decl(unknownType1.ts, 135, 19)) +>z : Symbol(z, Decl(unknownType1.ts, 135, 31)) let o1 = { a: 42, ...x }; // { a: number } ->o1 : Symbol(o1, Decl(unknownType1.ts, 118, 7)) ->a : Symbol(a, Decl(unknownType1.ts, 118, 14)) ->x : Symbol(x, Decl(unknownType1.ts, 117, 12)) +>o1 : Symbol(o1, Decl(unknownType1.ts, 136, 7)) +>a : Symbol(a, Decl(unknownType1.ts, 136, 14)) +>x : Symbol(x, Decl(unknownType1.ts, 135, 13)) let o2 = { a: 42, ...x, ...y }; // unknown ->o2 : Symbol(o2, Decl(unknownType1.ts, 119, 7)) ->a : Symbol(a, Decl(unknownType1.ts, 119, 14)) ->x : Symbol(x, Decl(unknownType1.ts, 117, 12)) ->y : Symbol(y, Decl(unknownType1.ts, 117, 18)) +>o2 : Symbol(o2, Decl(unknownType1.ts, 137, 7)) +>a : Symbol(a, Decl(unknownType1.ts, 137, 14)) +>x : Symbol(x, Decl(unknownType1.ts, 135, 13)) +>y : Symbol(y, Decl(unknownType1.ts, 135, 19)) let o3 = { a: 42, ...x, ...y, ...z }; // any ->o3 : Symbol(o3, Decl(unknownType1.ts, 120, 7)) ->a : Symbol(a, Decl(unknownType1.ts, 120, 14)) ->x : Symbol(x, Decl(unknownType1.ts, 117, 12)) ->y : Symbol(y, Decl(unknownType1.ts, 117, 18)) ->z : Symbol(z, Decl(unknownType1.ts, 117, 30)) +>o3 : Symbol(o3, Decl(unknownType1.ts, 138, 7)) +>a : Symbol(a, Decl(unknownType1.ts, 138, 14)) +>x : Symbol(x, Decl(unknownType1.ts, 135, 13)) +>y : Symbol(y, Decl(unknownType1.ts, 135, 19)) +>z : Symbol(z, Decl(unknownType1.ts, 135, 31)) } // Functions with unknown return type don't need return expressions -function f8(): unknown { ->f8 : Symbol(f8, Decl(unknownType1.ts, 121, 1)) +function f27(): unknown { +>f27 : Symbol(f27, Decl(unknownType1.ts, 139, 1)) +} + +// Rest type cannot be created from unknown + +function f28(x: unknown) { +>f28 : Symbol(f28, Decl(unknownType1.ts, 144, 1)) +>x : Symbol(x, Decl(unknownType1.ts, 148, 13)) + + let { ...a } = x; // Error +>a : Symbol(a, Decl(unknownType1.ts, 149, 9)) +>x : Symbol(x, Decl(unknownType1.ts, 148, 13)) } // Class properties of type unknown don't need definite assignment class C1 { ->C1 : Symbol(C1, Decl(unknownType1.ts, 126, 1)) +>C1 : Symbol(C1, Decl(unknownType1.ts, 150, 1)) a: string; // Error ->a : Symbol(C1.a, Decl(unknownType1.ts, 130, 10)) +>a : Symbol(C1.a, Decl(unknownType1.ts, 154, 10)) b: unknown; ->b : Symbol(C1.b, Decl(unknownType1.ts, 131, 14)) +>b : Symbol(C1.b, Decl(unknownType1.ts, 155, 14)) c: any; ->c : Symbol(C1.c, Decl(unknownType1.ts, 132, 15)) +>c : Symbol(C1.c, Decl(unknownType1.ts, 156, 15)) } diff --git a/tests/baselines/reference/unknownType1.types b/tests/baselines/reference/unknownType1.types index f92ff19867c..a922e8f43bd 100644 --- a/tests/baselines/reference/unknownType1.types +++ b/tests/baselines/reference/unknownType1.types @@ -109,6 +109,85 @@ type T40 = keyof any; // string | number | symbol type T41 = keyof unknown; // string | number | symbol >T41 : string | number | symbol +// Only equality operators are allowed with unknown + +function f10(x: unknown) { +>f10 : (x: unknown) => void +>x : unknown + + x == 5; +>x == 5 : boolean +>x : unknown +>5 : 5 + + x !== 10; +>x !== 10 : boolean +>x : unknown +>10 : 10 + + x >= 0; // Error +>x >= 0 : boolean +>x : unknown +>0 : 0 + + x.foo; // Error +>x.foo : any +>x : unknown +>foo : any + + x[10]; // Error +>x[10] : any +>x : unknown +>10 : 10 + + x(); // Error +>x() : any +>x : unknown + + x + 1; // Error +>x + 1 : any +>x : unknown +>1 : 1 + + x * 2; // Error +>x * 2 : number +>x : unknown +>2 : 2 + + -x; // Error +>-x : number +>x : unknown + + +x; // Error +>+x : number +>x : unknown +} + +// No property accesses, element accesses, or function calls + +function f11(x: unknown) { +>f11 : (x: unknown) => void +>x : unknown + + x.foo; // Error +>x.foo : any +>x : unknown +>foo : any + + x[5]; // Error +>x[5] : any +>x : unknown +>5 : 5 + + x(); // Error +>x() : any +>x : unknown + + new x(); // Error +>new x() : any +>x : unknown +} + // typeof, instanceof, and user defined type predicates declare function isFunction(x: unknown): x is Function; @@ -117,8 +196,8 @@ declare function isFunction(x: unknown): x is Function; >x : any >Function : Function -function f1(x: unknown) { ->f1 : (x: unknown) => void +function f20(x: unknown) { +>f20 : (x: unknown) => void >x : unknown if (typeof x === "string" || typeof x === "number") { @@ -134,24 +213,6 @@ function f1(x: unknown) { x; // string | number >x : string | number - } - if (typeof x === "object") { ->typeof x === "object" : boolean ->typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" ->x : unknown ->"object" : "object" - - x; // object ->x : object - } - if (typeof x === "function") { ->typeof x === "function" : boolean ->typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" ->x : unknown ->"function" : "function" - - x; // object ->x : object } if (x instanceof Error) { >x instanceof Error : boolean @@ -189,8 +250,8 @@ type T52 = T50; // { [x: string]: number } // Anything is assignable to unknown -function f2(pAny: any, pNever: never, pT: T) { ->f2 : (pAny: any, pNever: never, pT: T) => void +function f21(pAny: any, pNever: never, pT: T) { +>f21 : (pAny: any, pNever: never, pT: T) => void >T : T >pAny : any >pNever : never @@ -247,8 +308,8 @@ function f2(pAny: any, pNever: never, pT: T) { // unknown assignable only to itself and any -function f3(x: unknown) { ->f3 : (x: unknown) => void +function f22(x: unknown) { +>f22 : (x: unknown) => void >x : unknown let v1: any = x; @@ -283,8 +344,8 @@ function f3(x: unknown) { // Type parameter 'T extends unknown' not related to object -function f4(x: T) { ->f4 : (x: T) => void +function f23(x: T) { +>f23 : (x: T) => void >T : T >x : T >T : T @@ -296,8 +357,8 @@ function f4(x: T) { // Anything but primitive assignable to { [x: string]: unknown } -function f5(x: { [x: string]: unknown }) { ->f5 : (x: { [x: string]: unknown; }) => void +function f24(x: { [x: string]: unknown }) { +>f24 : (x: { [x: string]: unknown; }) => void >x : { [x: string]: unknown; } >x : string @@ -329,8 +390,8 @@ function f5(x: { [x: string]: unknown }) { // Locals of type unknown always considered initialized -function f6() { ->f6 : () => void +function f25() { +>f25 : () => void let x: unknown; >x : unknown @@ -342,8 +403,8 @@ function f6() { // Spread of unknown causes result to be unknown -function f7(x: {}, y: unknown, z: any) { ->f7 : (x: {}, y: unknown, z: any) => void +function f26(x: {}, y: unknown, z: any) { +>f26 : (x: {}, y: unknown, z: any) => void >x : {} >y : unknown >z : any @@ -375,8 +436,19 @@ function f7(x: {}, y: unknown, z: any) { // Functions with unknown return type don't need return expressions -function f8(): unknown { ->f8 : () => unknown +function f27(): unknown { +>f27 : () => unknown +} + +// Rest type cannot be created from unknown + +function f28(x: unknown) { +>f28 : (x: unknown) => void +>x : unknown + + let { ...a } = x; // Error +>a : any +>x : unknown } // Class properties of type unknown don't need definite assignment