From f8453ccb734c9c5ba81f60ff1c386d39159c7326 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:00:26 +0000 Subject: [PATCH] Fix strictPropertyInitialization check to use effective value and add tests Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- src/compiler/program.ts | 2 +- ...onalPropertyTypesWithDefaultStrict.symbols | 18 ++++++++++++++++++ ...tionalPropertyTypesWithDefaultStrict.types | 19 +++++++++++++++++++ ...lizationDefaultStrictNullChecks.errors.txt | 15 +++++++++++++++ ...tializationDefaultStrictNullChecks.symbols | 17 +++++++++++++++++ ...nitializationDefaultStrictNullChecks.types | 19 +++++++++++++++++++ ...tOptionalPropertyTypesWithDefaultStrict.ts | 12 ++++++++++++ ...tyInitializationDefaultStrictNullChecks.ts | 12 ++++++++++++ 8 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.symbols create mode 100644 tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.types create mode 100644 tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.errors.txt create mode 100644 tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.symbols create mode 100644 tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.types create mode 100644 tests/cases/compiler/exactOptionalPropertyTypesWithDefaultStrict.ts create mode 100644 tests/cases/compiler/strictPropertyInitializationDefaultStrictNullChecks.ts diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 69d10046a4c..23c2a56ef04 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -4070,7 +4070,7 @@ export function createProgram(_rootNamesOrOptions: readonly string[] | CreatePro } function verifyCompilerOptions() { - if (options.strictPropertyInitialization && !getStrictOptionValue(options, "strictNullChecks")) { + if (getStrictOptionValue(options, "strictPropertyInitialization") && !getStrictOptionValue(options, "strictNullChecks")) { createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "strictPropertyInitialization", "strictNullChecks"); } if (options.exactOptionalPropertyTypes && !getStrictOptionValue(options, "strictNullChecks")) { diff --git a/tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.symbols b/tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.symbols new file mode 100644 index 00000000000..1adc8dd3413 --- /dev/null +++ b/tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.symbols @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/exactOptionalPropertyTypesWithDefaultStrict.ts] //// + +=== exactOptionalPropertyTypesWithDefaultStrict.ts === +// When strict is not specified, it defaults to true in TS 6.0. +// strictNullChecks is effectively true, so exactOptionalPropertyTypes +// should work without producing TS5052. + +interface Foo { +>Foo : Symbol(Foo, Decl(exactOptionalPropertyTypesWithDefaultStrict.ts, 0, 0)) + + bar?: string; +>bar : Symbol(Foo.bar, Decl(exactOptionalPropertyTypesWithDefaultStrict.ts, 4, 15)) +} + +const foo: Foo = {}; +>foo : Symbol(foo, Decl(exactOptionalPropertyTypesWithDefaultStrict.ts, 8, 5)) +>Foo : Symbol(Foo, Decl(exactOptionalPropertyTypesWithDefaultStrict.ts, 0, 0)) + diff --git a/tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.types b/tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.types new file mode 100644 index 00000000000..d01e8c73192 --- /dev/null +++ b/tests/baselines/reference/exactOptionalPropertyTypesWithDefaultStrict.types @@ -0,0 +1,19 @@ +//// [tests/cases/compiler/exactOptionalPropertyTypesWithDefaultStrict.ts] //// + +=== exactOptionalPropertyTypesWithDefaultStrict.ts === +// When strict is not specified, it defaults to true in TS 6.0. +// strictNullChecks is effectively true, so exactOptionalPropertyTypes +// should work without producing TS5052. + +interface Foo { + bar?: string; +>bar : string | undefined +> : ^^^^^^^^^^^^^^^^^^ +} + +const foo: Foo = {}; +>foo : Foo +> : ^^^ +>{} : {} +> : ^^ + diff --git a/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.errors.txt b/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.errors.txt new file mode 100644 index 00000000000..59e09d61dcd --- /dev/null +++ b/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.errors.txt @@ -0,0 +1,15 @@ +error TS5052: Option 'strictPropertyInitialization' cannot be specified without specifying option 'strictNullChecks'. + + +!!! error TS5052: Option 'strictPropertyInitialization' cannot be specified without specifying option 'strictNullChecks'. +==== strictPropertyInitializationDefaultStrictNullChecks.ts (0 errors) ==== + // When strict is not specified, it defaults to true in TS 6.0. + // strictPropertyInitialization is effectively true via the strict default. + // Specifying strictNullChecks: false should produce an error because + // strictPropertyInitialization requires strictNullChecks. + + class C { + x: number; + constructor() {} + } + \ No newline at end of file diff --git a/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.symbols b/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.symbols new file mode 100644 index 00000000000..90636cf313f --- /dev/null +++ b/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.symbols @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/strictPropertyInitializationDefaultStrictNullChecks.ts] //// + +=== strictPropertyInitializationDefaultStrictNullChecks.ts === +// When strict is not specified, it defaults to true in TS 6.0. +// strictPropertyInitialization is effectively true via the strict default. +// Specifying strictNullChecks: false should produce an error because +// strictPropertyInitialization requires strictNullChecks. + +class C { +>C : Symbol(C, Decl(strictPropertyInitializationDefaultStrictNullChecks.ts, 0, 0)) + + x: number; +>x : Symbol(C.x, Decl(strictPropertyInitializationDefaultStrictNullChecks.ts, 5, 9)) + + constructor() {} +} + diff --git a/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.types b/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.types new file mode 100644 index 00000000000..172d5f20639 --- /dev/null +++ b/tests/baselines/reference/strictPropertyInitializationDefaultStrictNullChecks.types @@ -0,0 +1,19 @@ +//// [tests/cases/compiler/strictPropertyInitializationDefaultStrictNullChecks.ts] //// + +=== strictPropertyInitializationDefaultStrictNullChecks.ts === +// When strict is not specified, it defaults to true in TS 6.0. +// strictPropertyInitialization is effectively true via the strict default. +// Specifying strictNullChecks: false should produce an error because +// strictPropertyInitialization requires strictNullChecks. + +class C { +>C : C +> : ^ + + x: number; +>x : number +> : ^^^^^^ + + constructor() {} +} + diff --git a/tests/cases/compiler/exactOptionalPropertyTypesWithDefaultStrict.ts b/tests/cases/compiler/exactOptionalPropertyTypesWithDefaultStrict.ts new file mode 100644 index 00000000000..0ab42117c3c --- /dev/null +++ b/tests/cases/compiler/exactOptionalPropertyTypesWithDefaultStrict.ts @@ -0,0 +1,12 @@ +// @exactOptionalPropertyTypes: true +// @noEmit: true + +// When strict is not specified, it defaults to true in TS 6.0. +// strictNullChecks is effectively true, so exactOptionalPropertyTypes +// should work without producing TS5052. + +interface Foo { + bar?: string; +} + +const foo: Foo = {}; diff --git a/tests/cases/compiler/strictPropertyInitializationDefaultStrictNullChecks.ts b/tests/cases/compiler/strictPropertyInitializationDefaultStrictNullChecks.ts new file mode 100644 index 00000000000..8094cfc9c85 --- /dev/null +++ b/tests/cases/compiler/strictPropertyInitializationDefaultStrictNullChecks.ts @@ -0,0 +1,12 @@ +// @strictNullChecks: false +// @noEmit: true + +// When strict is not specified, it defaults to true in TS 6.0. +// strictPropertyInitialization is effectively true via the strict default. +// Specifying strictNullChecks: false should produce an error because +// strictPropertyInitialization requires strictNullChecks. + +class C { + x: number; + constructor() {} +}