diff --git a/tests/baselines/reference/definiteAssignmentAssertions.errors.txt b/tests/baselines/reference/definiteAssignmentAssertions.errors.txt new file mode 100644 index 00000000000..d65d9b510ae --- /dev/null +++ b/tests/baselines/reference/definiteAssignmentAssertions.errors.txt @@ -0,0 +1,113 @@ +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(5,5): error TS2564: Property 'b' has no initializer and is not definitely assigned in the constructor. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(20,6): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(21,6): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(22,13): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(28,6): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(34,15): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(68,10): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(69,10): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(70,10): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(75,15): error TS1255: A definite assignment assertion '!' is not permitted in this context. +tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts(76,15): error TS1255: A definite assignment assertion '!' is not permitted in this context. + + +==== tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts (11 errors) ==== + // Suppress strict property initialization check + + class C1 { + a!: number; + b: string; // Error + ~ +!!! error TS2564: Property 'b' has no initializer and is not definitely assigned in the constructor. + } + + // Suppress definite assignment check in constructor + + class C2 { + a!: number; + constructor() { + let x = this.a; + } + } + + // Definite assignment assertion requires type annotation, no initializer, no static modifier + + class C3 { + a! = 1; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + b!: number = 1; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + static c!: number; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + } + + // Definite assignment assertion not permitted in ambient context + + declare class C4 { + a!: number; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + } + + // Definite assignment assertion not permitted on abstract property + + abstract class C5 { + abstract a!: number; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + } + + // Suppress definite assignment check for variable + + function f1() { + let x!: number; + let y = x; + var a!: number; + var b = a; + } + + function f2() { + let x!: string | number; + if (typeof x === "string") { + let s: string = x; + } + else { + let n: number = x; + } + } + + function f3() { + let x!: number; + const g = () => { + x = 1; + } + g(); + let y = x; + } + + // Definite assignment assertion requires type annotation and no initializer + + function f4() { + let a!; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + let b! = 1; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + let c!: number = 1; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + } + + // Definite assignment assertion not permitted in ambient context + + declare let v1!: number; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + declare var v2!: number; + ~ +!!! error TS1255: A definite assignment assertion '!' is not permitted in this context. + \ No newline at end of file diff --git a/tests/baselines/reference/definiteAssignmentAssertions.js b/tests/baselines/reference/definiteAssignmentAssertions.js new file mode 100644 index 00000000000..70bab1b9c23 --- /dev/null +++ b/tests/baselines/reference/definiteAssignmentAssertions.js @@ -0,0 +1,166 @@ +//// [definiteAssignmentAssertions.ts] +// Suppress strict property initialization check + +class C1 { + a!: number; + b: string; // Error +} + +// Suppress definite assignment check in constructor + +class C2 { + a!: number; + constructor() { + let x = this.a; + } +} + +// Definite assignment assertion requires type annotation, no initializer, no static modifier + +class C3 { + a! = 1; + b!: number = 1; + static c!: number; +} + +// Definite assignment assertion not permitted in ambient context + +declare class C4 { + a!: number; +} + +// Definite assignment assertion not permitted on abstract property + +abstract class C5 { + abstract a!: number; +} + +// Suppress definite assignment check for variable + +function f1() { + let x!: number; + let y = x; + var a!: number; + var b = a; +} + +function f2() { + let x!: string | number; + if (typeof x === "string") { + let s: string = x; + } + else { + let n: number = x; + } +} + +function f3() { + let x!: number; + const g = () => { + x = 1; + } + g(); + let y = x; +} + +// Definite assignment assertion requires type annotation and no initializer + +function f4() { + let a!; + let b! = 1; + let c!: number = 1; +} + +// Definite assignment assertion not permitted in ambient context + +declare let v1!: number; +declare var v2!: number; + + +//// [definiteAssignmentAssertions.js] +"use strict"; +// Suppress strict property initialization check +var C1 = /** @class */ (function () { + function C1() { + } + return C1; +}()); +// Suppress definite assignment check in constructor +var C2 = /** @class */ (function () { + function C2() { + var x = this.a; + } + return C2; +}()); +// Definite assignment assertion requires type annotation, no initializer, no static modifier +var C3 = /** @class */ (function () { + function C3() { + this.a = 1; + this.b = 1; + } + return C3; +}()); +// Definite assignment assertion not permitted on abstract property +var C5 = /** @class */ (function () { + function C5() { + } + return C5; +}()); +// Suppress definite assignment check for variable +function f1() { + var x; + var y = x; + var a; + var b = a; +} +function f2() { + var x; + if (typeof x === "string") { + var s = x; + } + else { + var n = x; + } +} +function f3() { + var x; + var g = function () { + x = 1; + }; + g(); + var y = x; +} +// Definite assignment assertion requires type annotation and no initializer +function f4() { + var a; + var b = 1; + var c = 1; +} + + +//// [definiteAssignmentAssertions.d.ts] +declare class C1 { + a: number; + b: string; +} +declare class C2 { + a: number; + constructor(); +} +declare class C3 { + a: number; + b: number; + static c: number; +} +declare class C4 { + a: number; +} +declare abstract class C5 { + abstract a: number; +} +declare function f1(): void; +declare function f2(): void; +declare function f3(): void; +declare function f4(): void; +declare let v1: number; +declare var v2: number; diff --git a/tests/baselines/reference/definiteAssignmentAssertions.symbols b/tests/baselines/reference/definiteAssignmentAssertions.symbols new file mode 100644 index 00000000000..a291172c83b --- /dev/null +++ b/tests/baselines/reference/definiteAssignmentAssertions.symbols @@ -0,0 +1,146 @@ +=== tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts === +// Suppress strict property initialization check + +class C1 { +>C1 : Symbol(C1, Decl(definiteAssignmentAssertions.ts, 0, 0)) + + a!: number; +>a : Symbol(C1.a, Decl(definiteAssignmentAssertions.ts, 2, 10)) + + b: string; // Error +>b : Symbol(C1.b, Decl(definiteAssignmentAssertions.ts, 3, 15)) +} + +// Suppress definite assignment check in constructor + +class C2 { +>C2 : Symbol(C2, Decl(definiteAssignmentAssertions.ts, 5, 1)) + + a!: number; +>a : Symbol(C2.a, Decl(definiteAssignmentAssertions.ts, 9, 10)) + + constructor() { + let x = this.a; +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 12, 11)) +>this.a : Symbol(C2.a, Decl(definiteAssignmentAssertions.ts, 9, 10)) +>this : Symbol(C2, Decl(definiteAssignmentAssertions.ts, 5, 1)) +>a : Symbol(C2.a, Decl(definiteAssignmentAssertions.ts, 9, 10)) + } +} + +// Definite assignment assertion requires type annotation, no initializer, no static modifier + +class C3 { +>C3 : Symbol(C3, Decl(definiteAssignmentAssertions.ts, 14, 1)) + + a! = 1; +>a : Symbol(C3.a, Decl(definiteAssignmentAssertions.ts, 18, 10)) + + b!: number = 1; +>b : Symbol(C3.b, Decl(definiteAssignmentAssertions.ts, 19, 11)) + + static c!: number; +>c : Symbol(C3.c, Decl(definiteAssignmentAssertions.ts, 20, 19)) +} + +// Definite assignment assertion not permitted in ambient context + +declare class C4 { +>C4 : Symbol(C4, Decl(definiteAssignmentAssertions.ts, 22, 1)) + + a!: number; +>a : Symbol(C4.a, Decl(definiteAssignmentAssertions.ts, 26, 18)) +} + +// Definite assignment assertion not permitted on abstract property + +abstract class C5 { +>C5 : Symbol(C5, Decl(definiteAssignmentAssertions.ts, 28, 1)) + + abstract a!: number; +>a : Symbol(C5.a, Decl(definiteAssignmentAssertions.ts, 32, 19)) +} + +// Suppress definite assignment check for variable + +function f1() { +>f1 : Symbol(f1, Decl(definiteAssignmentAssertions.ts, 34, 1)) + + let x!: number; +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 39, 7)) + + let y = x; +>y : Symbol(y, Decl(definiteAssignmentAssertions.ts, 40, 7)) +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 39, 7)) + + var a!: number; +>a : Symbol(a, Decl(definiteAssignmentAssertions.ts, 41, 7)) + + var b = a; +>b : Symbol(b, Decl(definiteAssignmentAssertions.ts, 42, 7)) +>a : Symbol(a, Decl(definiteAssignmentAssertions.ts, 41, 7)) +} + +function f2() { +>f2 : Symbol(f2, Decl(definiteAssignmentAssertions.ts, 43, 1)) + + let x!: string | number; +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 46, 7)) + + if (typeof x === "string") { +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 46, 7)) + + let s: string = x; +>s : Symbol(s, Decl(definiteAssignmentAssertions.ts, 48, 11)) +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 46, 7)) + } + else { + let n: number = x; +>n : Symbol(n, Decl(definiteAssignmentAssertions.ts, 51, 11)) +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 46, 7)) + } +} + +function f3() { +>f3 : Symbol(f3, Decl(definiteAssignmentAssertions.ts, 53, 1)) + + let x!: number; +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 56, 7)) + + const g = () => { +>g : Symbol(g, Decl(definiteAssignmentAssertions.ts, 57, 9)) + + x = 1; +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 56, 7)) + } + g(); +>g : Symbol(g, Decl(definiteAssignmentAssertions.ts, 57, 9)) + + let y = x; +>y : Symbol(y, Decl(definiteAssignmentAssertions.ts, 61, 7)) +>x : Symbol(x, Decl(definiteAssignmentAssertions.ts, 56, 7)) +} + +// Definite assignment assertion requires type annotation and no initializer + +function f4() { +>f4 : Symbol(f4, Decl(definiteAssignmentAssertions.ts, 62, 1)) + + let a!; +>a : Symbol(a, Decl(definiteAssignmentAssertions.ts, 67, 7)) + + let b! = 1; +>b : Symbol(b, Decl(definiteAssignmentAssertions.ts, 68, 7)) + + let c!: number = 1; +>c : Symbol(c, Decl(definiteAssignmentAssertions.ts, 69, 7)) +} + +// Definite assignment assertion not permitted in ambient context + +declare let v1!: number; +>v1 : Symbol(v1, Decl(definiteAssignmentAssertions.ts, 74, 11)) + +declare var v2!: number; +>v2 : Symbol(v2, Decl(definiteAssignmentAssertions.ts, 75, 11)) + diff --git a/tests/baselines/reference/definiteAssignmentAssertions.types b/tests/baselines/reference/definiteAssignmentAssertions.types new file mode 100644 index 00000000000..92646bab86e --- /dev/null +++ b/tests/baselines/reference/definiteAssignmentAssertions.types @@ -0,0 +1,157 @@ +=== tests/cases/conformance/controlFlow/definiteAssignmentAssertions.ts === +// Suppress strict property initialization check + +class C1 { +>C1 : C1 + + a!: number; +>a : number + + b: string; // Error +>b : string +} + +// Suppress definite assignment check in constructor + +class C2 { +>C2 : C2 + + a!: number; +>a : number + + constructor() { + let x = this.a; +>x : number +>this.a : number +>this : this +>a : number + } +} + +// Definite assignment assertion requires type annotation, no initializer, no static modifier + +class C3 { +>C3 : C3 + + a! = 1; +>a : number +>1 : 1 + + b!: number = 1; +>b : number +>1 : 1 + + static c!: number; +>c : number +} + +// Definite assignment assertion not permitted in ambient context + +declare class C4 { +>C4 : C4 + + a!: number; +>a : number +} + +// Definite assignment assertion not permitted on abstract property + +abstract class C5 { +>C5 : C5 + + abstract a!: number; +>a : number +} + +// Suppress definite assignment check for variable + +function f1() { +>f1 : () => void + + let x!: number; +>x : number + + let y = x; +>y : number +>x : number + + var a!: number; +>a : number + + var b = a; +>b : number +>a : number +} + +function f2() { +>f2 : () => void + + let x!: string | number; +>x : string | number + + if (typeof x === "string") { +>typeof x === "string" : boolean +>typeof x : "string" | "number" | "boolean" | "symbol" | "undefined" | "object" | "function" +>x : string | number +>"string" : "string" + + let s: string = x; +>s : string +>x : string + } + else { + let n: number = x; +>n : number +>x : number + } +} + +function f3() { +>f3 : () => void + + let x!: number; +>x : number + + const g = () => { +>g : () => void +>() => { x = 1; } : () => void + + x = 1; +>x = 1 : 1 +>x : number +>1 : 1 + } + g(); +>g() : void +>g : () => void + + let y = x; +>y : number +>x : number +} + +// Definite assignment assertion requires type annotation and no initializer + +function f4() { +>f4 : () => void + + let a!; +>a : any + + let b! = 1; +>b : number +>1 : 1 + + let c!: number = 1; +>c : number +>1 : 1 +} + +// Definite assignment assertion not permitted in ambient context + +declare let v1!: number; +>v1 : number + +declare var v2!: number; +>v2 : number +