Accept new baselines

This commit is contained in:
Anders Hejlsberg 2018-05-27 15:44:08 -07:00
parent 31c73defa7
commit a4a73df839
5 changed files with 447 additions and 206 deletions

View file

@ -41,17 +41,17 @@ function boxify<T>(obj: T): Boxified<T> {
for (let k in obj) {
>k : Extract<keyof T, string>
>obj : T & object
>obj : T
result[k] = { value: obj[k] };
>result[k] = { value: obj[k] } : { value: (T & object)[Extract<keyof T, string>]; }
>result[k] = { value: obj[k] } : { value: T[Extract<keyof T, string>]; }
>result[k] : Boxified<T>[Extract<keyof T, string>]
>result : Boxified<T>
>k : Extract<keyof T, string>
>{ value: obj[k] } : { value: (T & object)[Extract<keyof T, string>]; }
>value : (T & object)[Extract<keyof T, string>]
>obj[k] : (T & object)[Extract<keyof T, string>]
>obj : T & object
>{ value: obj[k] } : { value: T[Extract<keyof T, string>]; }
>value : T[Extract<keyof T, string>]
>obj[k] : T[Extract<keyof T, string>]
>obj : T
>k : Extract<keyof T, string>
}
return result;

View file

@ -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<T>(pAny: any, pNever: never, pT: T) {
function f21<T>(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<T extends unknown>(x: T) {
function f23<T extends unknown>(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

View file

@ -38,20 +38,38 @@ type T33<T> = 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<any>; // { [x: string]: number }
// Anything is assignable to unknown
function f2<T>(pAny: any, pNever: never, pT: T) {
function f21<T>(pAny: any, pNever: never, pT: T) {
let x: unknown;
x = 123;
x = "hello";
@ -82,7 +100,7 @@ function f2<T>(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<T extends unknown>(x: T) {
function f23<T extends unknown>(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 () {

View file

@ -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<T> = { [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<unknown>; // { [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<any>; // { [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<T>(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<T>(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<T extends unknown>(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<T extends unknown>(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))
}

View file

@ -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<any>; // { [x: string]: number }
// Anything is assignable to unknown
function f2<T>(pAny: any, pNever: never, pT: T) {
>f2 : <T>(pAny: any, pNever: never, pT: T) => void
function f21<T>(pAny: any, pNever: never, pT: T) {
>f21 : <T>(pAny: any, pNever: never, pT: T) => void
>T : T
>pAny : any
>pNever : never
@ -247,8 +308,8 @@ function f2<T>(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<T extends unknown>(x: T) {
>f4 : <T extends unknown>(x: T) => void
function f23<T extends unknown>(x: T) {
>f23 : <T extends unknown>(x: T) => void
>T : T
>x : T
>T : T
@ -296,8 +357,8 @@ function f4<T extends unknown>(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