diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fcf5c3854c960..4cfc2ed482612 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -38507,12 +38507,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { error(getter.name, Diagnostics.A_get_accessor_must_be_at_least_as_accessible_as_the_setter); error(setter.name, Diagnostics.A_get_accessor_must_be_at_least_as_accessible_as_the_setter); } - - const getterType = getAnnotatedAccessorType(getter); - const setterType = getAnnotatedAccessorType(setter); - if (getterType && setterType) { - checkTypeAssignableTo(getterType, setterType, getter, Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type); - } } } const returnType = getTypeOfAccessors(getSymbolOfDeclaration(node)); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 6ca4ec9e0941a..37526957ef7d1 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1972,10 +1972,6 @@ "category": "Error", "code": 2379 }, - "The return type of a 'get' accessor must be assignable to its 'set' accessor type": { - "category": "Error", - "code": 2380 - }, "Overload signatures must all be exported or non-exported.": { "category": "Error", "code": 2383 diff --git a/tests/baselines/reference/abstractPropertyNegative.errors.txt b/tests/baselines/reference/abstractPropertyNegative.errors.txt index dab4d317d6712..cfacc4b4ad1a6 100644 --- a/tests/baselines/reference/abstractPropertyNegative.errors.txt +++ b/tests/baselines/reference/abstractPropertyNegative.errors.txt @@ -1,4 +1,3 @@ -tests/cases/compiler/abstractPropertyNegative.ts(10,18): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS18052: Non-abstract class 'C' does not implement all abstract members of 'B' tests/cases/compiler/abstractPropertyNegative.ts(15,5): error TS1253: Abstract properties can only appear within an abstract class. tests/cases/compiler/abstractPropertyNegative.ts(16,37): error TS1005: '{' expected. @@ -15,7 +14,7 @@ tests/cases/compiler/abstractPropertyNegative.ts(40,9): error TS2676: Accessors tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors must both be abstract or non-abstract. -==== tests/cases/compiler/abstractPropertyNegative.ts (12 errors) ==== +==== tests/cases/compiler/abstractPropertyNegative.ts (11 errors) ==== interface A { prop: string; m(): string; @@ -26,9 +25,7 @@ tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors abstract get readonlyProp(): string; abstract m(): string; abstract get mismatch(): string; - ~~~~~~~~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type - abstract set mismatch(val: number); // error, not same type + abstract set mismatch(val: number); } class C extends B { ~ diff --git a/tests/baselines/reference/abstractPropertyNegative.js b/tests/baselines/reference/abstractPropertyNegative.js index b8c3e46a5cade..93a7035793bad 100644 --- a/tests/baselines/reference/abstractPropertyNegative.js +++ b/tests/baselines/reference/abstractPropertyNegative.js @@ -9,7 +9,7 @@ abstract class B implements A { abstract get readonlyProp(): string; abstract m(): string; abstract get mismatch(): string; - abstract set mismatch(val: number); // error, not same type + abstract set mismatch(val: number); } class C extends B { readonly ro = "readonly please"; diff --git a/tests/baselines/reference/abstractPropertyNegative.symbols b/tests/baselines/reference/abstractPropertyNegative.symbols index 16fa75b309f87..a3a007dc66854 100644 --- a/tests/baselines/reference/abstractPropertyNegative.symbols +++ b/tests/baselines/reference/abstractPropertyNegative.symbols @@ -27,7 +27,7 @@ abstract class B implements A { abstract get mismatch(): string; >mismatch : Symbol(B.mismatch, Decl(abstractPropertyNegative.ts, 8, 25), Decl(abstractPropertyNegative.ts, 9, 36)) - abstract set mismatch(val: number); // error, not same type + abstract set mismatch(val: number); >mismatch : Symbol(B.mismatch, Decl(abstractPropertyNegative.ts, 8, 25), Decl(abstractPropertyNegative.ts, 9, 36)) >val : Symbol(val, Decl(abstractPropertyNegative.ts, 10, 26)) } diff --git a/tests/baselines/reference/abstractPropertyNegative.types b/tests/baselines/reference/abstractPropertyNegative.types index 0ae88cc778568..00447aa2f8a92 100644 --- a/tests/baselines/reference/abstractPropertyNegative.types +++ b/tests/baselines/reference/abstractPropertyNegative.types @@ -24,7 +24,7 @@ abstract class B implements A { abstract get mismatch(): string; >mismatch : string - abstract set mismatch(val: number); // error, not same type + abstract set mismatch(val: number); >mismatch : string >val : number } diff --git a/tests/baselines/reference/divergentAccessorsTypes6.errors.txt b/tests/baselines/reference/divergentAccessorsTypes6.errors.txt new file mode 100644 index 0000000000000..1c5b9e164ef62 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes6.errors.txt @@ -0,0 +1,50 @@ +tests/cases/compiler/divergentAccessorsTypes6.ts(11,1): error TS2322: Type 'CSSStyleDeclaration' is not assignable to type 'string'. +tests/cases/compiler/divergentAccessorsTypes6.ts(19,23): error TS2344: Type 'string' does not satisfy the constraint 'never'. +tests/cases/compiler/divergentAccessorsTypes6.ts(23,23): error TS2344: Type 'string' does not satisfy the constraint 'never'. +tests/cases/compiler/divergentAccessorsTypes6.ts(29,16): error TS2322: Type 'number' is not assignable to type 'string'. + + +==== tests/cases/compiler/divergentAccessorsTypes6.ts (4 errors) ==== + export {}; + + interface Element { + get style(): CSSStyleDeclaration; + set style(cssText: string); + } + + declare const element: Element; + element.style = "color: red"; + element.style.animationTimingFunction; + element.style = element.style; // error + ~~~~~~~~~~~~~ +!!! error TS2322: Type 'CSSStyleDeclaration' is not assignable to type 'string'. + + // Now that we don't check for getter/setter assignability, we should + // ensure the setter annotation is actually checked even if it's never observed. + + type Fail = T; + interface I1 { + get x(): number; + set x(value: Fail); + ~~~~~~ +!!! error TS2344: Type 'string' does not satisfy the constraint 'never'. + } + const o1 = { + get x(): number { return 0; }, + set x(value: Fail) {} + ~~~~~~ +!!! error TS2344: Type 'string' does not satisfy the constraint 'never'. + } + + // A setter annotation still implies the getter return type. + + const o2 = { + get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation + ~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + set p1(value: string) {}, + + get p2(): number { return 0; }, // ok - explicit annotation + set p2(value: string) {}, + }; + \ No newline at end of file diff --git a/tests/baselines/reference/divergentAccessorsTypes6.js b/tests/baselines/reference/divergentAccessorsTypes6.js new file mode 100644 index 0000000000000..d9a5287435ecf --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes6.js @@ -0,0 +1,58 @@ +//// [divergentAccessorsTypes6.ts] +export {}; + +interface Element { + get style(): CSSStyleDeclaration; + set style(cssText: string); +} + +declare const element: Element; +element.style = "color: red"; +element.style.animationTimingFunction; +element.style = element.style; // error + +// Now that we don't check for getter/setter assignability, we should +// ensure the setter annotation is actually checked even if it's never observed. + +type Fail = T; +interface I1 { + get x(): number; + set x(value: Fail); +} +const o1 = { + get x(): number { return 0; }, + set x(value: Fail) {} +} + +// A setter annotation still implies the getter return type. + +const o2 = { + get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation + set p1(value: string) {}, + + get p2(): number { return 0; }, // ok - explicit annotation + set p2(value: string) {}, +}; + + +//// [divergentAccessorsTypes6.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +element.style = "color: red"; +element.style.animationTimingFunction; +element.style = element.style; // error +var o1 = { + get x() { return 0; }, + set x(value) { } +}; +// A setter annotation still implies the getter return type. +var o2 = { + get p1() { return 0; }, + set p1(value) { }, + get p2() { return 0; }, + set p2(value) { }, +}; + + +//// [divergentAccessorsTypes6.d.ts] +export {}; diff --git a/tests/baselines/reference/divergentAccessorsTypes6.symbols b/tests/baselines/reference/divergentAccessorsTypes6.symbols new file mode 100644 index 0000000000000..8877e235e9482 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes6.symbols @@ -0,0 +1,91 @@ +=== tests/cases/compiler/divergentAccessorsTypes6.ts === +export {}; + +interface Element { +>Element : Symbol(Element, Decl(divergentAccessorsTypes6.ts, 0, 10)) + + get style(): CSSStyleDeclaration; +>style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>CSSStyleDeclaration : Symbol(CSSStyleDeclaration, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --)) + + set style(cssText: string); +>style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>cssText : Symbol(cssText, Decl(divergentAccessorsTypes6.ts, 4, 14)) +} + +declare const element: Element; +>element : Symbol(element, Decl(divergentAccessorsTypes6.ts, 7, 13)) +>Element : Symbol(Element, Decl(divergentAccessorsTypes6.ts, 0, 10)) + +element.style = "color: red"; +>element.style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>element : Symbol(element, Decl(divergentAccessorsTypes6.ts, 7, 13)) +>style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) + +element.style.animationTimingFunction; +>element.style.animationTimingFunction : Symbol(CSSStyleDeclaration.animationTimingFunction, Decl(lib.dom.d.ts, --, --)) +>element.style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>element : Symbol(element, Decl(divergentAccessorsTypes6.ts, 7, 13)) +>style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>animationTimingFunction : Symbol(CSSStyleDeclaration.animationTimingFunction, Decl(lib.dom.d.ts, --, --)) + +element.style = element.style; // error +>element.style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>element : Symbol(element, Decl(divergentAccessorsTypes6.ts, 7, 13)) +>style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>element.style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) +>element : Symbol(element, Decl(divergentAccessorsTypes6.ts, 7, 13)) +>style : Symbol(Element.style, Decl(divergentAccessorsTypes6.ts, 2, 19), Decl(divergentAccessorsTypes6.ts, 3, 37)) + +// Now that we don't check for getter/setter assignability, we should +// ensure the setter annotation is actually checked even if it's never observed. + +type Fail = T; +>Fail : Symbol(Fail, Decl(divergentAccessorsTypes6.ts, 10, 30)) +>T : Symbol(T, Decl(divergentAccessorsTypes6.ts, 15, 10)) +>T : Symbol(T, Decl(divergentAccessorsTypes6.ts, 15, 10)) + +interface I1 { +>I1 : Symbol(I1, Decl(divergentAccessorsTypes6.ts, 15, 31)) + + get x(): number; +>x : Symbol(I1.x, Decl(divergentAccessorsTypes6.ts, 16, 14), Decl(divergentAccessorsTypes6.ts, 17, 20)) + + set x(value: Fail); +>x : Symbol(I1.x, Decl(divergentAccessorsTypes6.ts, 16, 14), Decl(divergentAccessorsTypes6.ts, 17, 20)) +>value : Symbol(value, Decl(divergentAccessorsTypes6.ts, 18, 10)) +>Fail : Symbol(Fail, Decl(divergentAccessorsTypes6.ts, 10, 30)) +} +const o1 = { +>o1 : Symbol(o1, Decl(divergentAccessorsTypes6.ts, 20, 5)) + + get x(): number { return 0; }, +>x : Symbol(x, Decl(divergentAccessorsTypes6.ts, 20, 12), Decl(divergentAccessorsTypes6.ts, 21, 34)) + + set x(value: Fail) {} +>x : Symbol(x, Decl(divergentAccessorsTypes6.ts, 20, 12), Decl(divergentAccessorsTypes6.ts, 21, 34)) +>value : Symbol(value, Decl(divergentAccessorsTypes6.ts, 22, 10)) +>Fail : Symbol(Fail, Decl(divergentAccessorsTypes6.ts, 10, 30)) +} + +// A setter annotation still implies the getter return type. + +const o2 = { +>o2 : Symbol(o2, Decl(divergentAccessorsTypes6.ts, 27, 5)) + + get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation +>p1 : Symbol(p1, Decl(divergentAccessorsTypes6.ts, 27, 12), Decl(divergentAccessorsTypes6.ts, 28, 27)) + + set p1(value: string) {}, +>p1 : Symbol(p1, Decl(divergentAccessorsTypes6.ts, 27, 12), Decl(divergentAccessorsTypes6.ts, 28, 27)) +>value : Symbol(value, Decl(divergentAccessorsTypes6.ts, 29, 11)) + + get p2(): number { return 0; }, // ok - explicit annotation +>p2 : Symbol(p2, Decl(divergentAccessorsTypes6.ts, 29, 29), Decl(divergentAccessorsTypes6.ts, 31, 35)) + + set p2(value: string) {}, +>p2 : Symbol(p2, Decl(divergentAccessorsTypes6.ts, 29, 29), Decl(divergentAccessorsTypes6.ts, 31, 35)) +>value : Symbol(value, Decl(divergentAccessorsTypes6.ts, 32, 11)) + +}; + diff --git a/tests/baselines/reference/divergentAccessorsTypes6.types b/tests/baselines/reference/divergentAccessorsTypes6.types new file mode 100644 index 0000000000000..fd5afc66f009e --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes6.types @@ -0,0 +1,89 @@ +=== tests/cases/compiler/divergentAccessorsTypes6.ts === +export {}; + +interface Element { + get style(): CSSStyleDeclaration; +>style : CSSStyleDeclaration + + set style(cssText: string); +>style : CSSStyleDeclaration +>cssText : string +} + +declare const element: Element; +>element : Element + +element.style = "color: red"; +>element.style = "color: red" : "color: red" +>element.style : string +>element : Element +>style : string +>"color: red" : "color: red" + +element.style.animationTimingFunction; +>element.style.animationTimingFunction : string +>element.style : CSSStyleDeclaration +>element : Element +>style : CSSStyleDeclaration +>animationTimingFunction : string + +element.style = element.style; // error +>element.style = element.style : CSSStyleDeclaration +>element.style : string +>element : Element +>style : string +>element.style : CSSStyleDeclaration +>element : Element +>style : CSSStyleDeclaration + +// Now that we don't check for getter/setter assignability, we should +// ensure the setter annotation is actually checked even if it's never observed. + +type Fail = T; +>Fail : T + +interface I1 { + get x(): number; +>x : number + + set x(value: Fail); +>x : number +>value : string +} +const o1 = { +>o1 : { x: number; } +>{ get x(): number { return 0; }, set x(value: Fail) {}} : { x: number; } + + get x(): number { return 0; }, +>x : number +>0 : 0 + + set x(value: Fail) {} +>x : number +>value : string +} + +// A setter annotation still implies the getter return type. + +const o2 = { +>o2 : { p1: string; p2: number; } +>{ get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation set p1(value: string) {}, get p2(): number { return 0; }, // ok - explicit annotation set p2(value: string) {},} : { p1: string; p2: number; } + + get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation +>p1 : string +>0 : 0 + + set p1(value: string) {}, +>p1 : string +>value : string + + get p2(): number { return 0; }, // ok - explicit annotation +>p2 : number +>0 : 0 + + set p2(value: string) {}, +>p2 : number +>value : string + +}; + diff --git a/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt deleted file mode 100644 index 3a64426de77c2..0000000000000 --- a/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt +++ /dev/null @@ -1,12 +0,0 @@ -tests/cases/compiler/getAndSetNotIdenticalType.ts(2,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type - - -==== tests/cases/compiler/getAndSetNotIdenticalType.ts (1 errors) ==== - class C { - get x(): number { - ~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type - return 1; - } - set x(v: string) { } - } \ No newline at end of file diff --git a/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt index 6d7852a12f0eb..15836abf6e1c8 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt @@ -1,5 +1,3 @@ -tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type - Type 'T' is not assignable to type 'string'. tests/cases/compiler/getAndSetNotIdenticalType2.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. Type 'string' is not assignable to type 'T'. 'T' could be instantiated with an arbitrary type which could be unrelated to 'string'. @@ -7,16 +5,12 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(15,1): error TS2322: Type 'A< Type 'unknown' is not assignable to type 'string'. -==== tests/cases/compiler/getAndSetNotIdenticalType2.ts (3 errors) ==== +==== tests/cases/compiler/getAndSetNotIdenticalType2.ts (2 errors) ==== class A { foo: T; } class C { data: A; get x(): A { - ~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type -!!! error TS2380: Type 'T' is not assignable to type 'string'. -!!! related TS2208 tests/cases/compiler/getAndSetNotIdenticalType2.ts:3:9: This type parameter might need an `extends string` constraint. return this.data; } set x(v: A) { diff --git a/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt index 3d637a014e97a..b9bd8cfa5da66 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt @@ -1,19 +1,15 @@ -tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type - Type 'number' is not assignable to type 'string'. tests/cases/compiler/getAndSetNotIdenticalType3.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. Type 'string' is not assignable to type 'number'. tests/cases/compiler/getAndSetNotIdenticalType3.ts(15,1): error TS2322: Type 'A' is not assignable to type 'A'. + Type 'number' is not assignable to type 'string'. -==== tests/cases/compiler/getAndSetNotIdenticalType3.ts (3 errors) ==== +==== tests/cases/compiler/getAndSetNotIdenticalType3.ts (2 errors) ==== class A { foo: T; } class C { data: A; get x(): A { - ~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type -!!! error TS2380: Type 'number' is not assignable to type 'string'. return this.data; } set x(v: A) { @@ -28,4 +24,5 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(15,1): error TS2322: Type 'A< var r = x.x; x.x = r; ~~~ -!!! error TS2322: Type 'A' is not assignable to type 'A'. \ No newline at end of file +!!! error TS2322: Type 'A' is not assignable to type 'A'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/getterErrorMessageNotDuplicated.errors.txt b/tests/baselines/reference/getterErrorMessageNotDuplicated.errors.txt deleted file mode 100644 index 93e87826f03f5..0000000000000 --- a/tests/baselines/reference/getterErrorMessageNotDuplicated.errors.txt +++ /dev/null @@ -1,22 +0,0 @@ -tests/cases/compiler/getterErrorMessageNotDuplicated.ts(2,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type - Property 'extra' is missing in type 'Foo' but required in type 'Bar'. - - -==== tests/cases/compiler/getterErrorMessageNotDuplicated.ts (1 errors) ==== - interface Thing { - get style(): Foo; - ~~~~~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type -!!! error TS2380: Property 'extra' is missing in type 'Foo' but required in type 'Bar'. -!!! related TS2728 tests/cases/compiler/getterErrorMessageNotDuplicated.ts:12:5: 'extra' is declared here. - set style(cssText: string | Bar); - } - - interface Foo { - hello: string; - world: number; - } - - interface Bar extends Foo { - extra: any; - } \ No newline at end of file diff --git a/tests/baselines/reference/objectLiteralErrors.errors.txt b/tests/baselines/reference/objectLiteralErrors.errors.txt index 878f4a0e21644..9a6fdc6a015fa 100644 --- a/tests/baselines/reference/objectLiteralErrors.errors.txt +++ b/tests/baselines/reference/objectLiteralErrors.errors.txt @@ -70,15 +70,13 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(38,26) tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,13): error TS2300: Duplicate identifier 'a'. tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,46): error TS1119: An object literal cannot have property and accessor with the same name. tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,46): error TS2300: Duplicate identifier 'a'. -tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(42,16): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(43,22): error TS2322: Type 'number' is not assignable to type 'string'. -tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(44,16): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(48,7): error TS1312: Did you mean to use a ':'? An '=' can only follow a property name when the containing object literal is part of a destructuring pattern. tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(49,7): error TS1312: Did you mean to use a ':'? An '=' can only follow a property name when the containing object literal is part of a destructuring pattern. tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(50,5): error TS18016: Private identifiers are not allowed outside class bodies. -==== tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts (78 errors) ==== +==== tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts (76 errors) ==== // Multiple properties with the same name var e1 = { a: 0, a: 0 }; ~ @@ -263,16 +261,12 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(50,5): ~ !!! error TS2300: Duplicate identifier 'a'. - // Get and set accessor with mismatched type annotations + // Get and set accessor with mismatched type annotations (only g2 is an error after #43662 implemented) var g1 = { get a(): number { return 4; }, set a(n: string) { } }; - ~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type var g2 = { get a() { return 4; }, set a(n: string) { } }; ~~~~~~ !!! error TS2322: Type 'number' is not assignable to type 'string'. var g3 = { get a(): number { return undefined; }, set a(n: string) { } }; - ~ -!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type // did you mean colon errors var h1 = { diff --git a/tests/baselines/reference/objectLiteralErrors.js b/tests/baselines/reference/objectLiteralErrors.js index 4da3e1bd5d564..f280e027aeefd 100644 --- a/tests/baselines/reference/objectLiteralErrors.js +++ b/tests/baselines/reference/objectLiteralErrors.js @@ -39,7 +39,7 @@ var f15 = { "100": 0, get 1e2() { return 0; } }; var f16 = { 0x20: 0, get 3.2e1() { return 0; } }; var f17 = { a: 0, get b() { return 1; }, get a() { return 0; } }; -// Get and set accessor with mismatched type annotations +// Get and set accessor with mismatched type annotations (only g2 is an error after #43662 implemented) var g1 = { get a(): number { return 4; }, set a(n: string) { } }; var g2 = { get a() { return 4; }, set a(n: string) { } }; var g3 = { get a(): number { return undefined; }, set a(n: string) { } }; @@ -91,7 +91,7 @@ var f14 = { 0: 0, get 0o0() { return 0; } }; var f15 = { "100": 0, get 1e2() { return 0; } }; var f16 = { 0x20: 0, get 3.2e1() { return 0; } }; var f17 = { a: 0, get b() { return 1; }, get a() { return 0; } }; -// Get and set accessor with mismatched type annotations +// Get and set accessor with mismatched type annotations (only g2 is an error after #43662 implemented) var g1 = { get a() { return 4; }, set a(n) { } }; var g2 = { get a() { return 4; }, set a(n) { } }; var g3 = { get a() { return undefined; }, set a(n) { } }; diff --git a/tests/baselines/reference/objectLiteralErrors.symbols b/tests/baselines/reference/objectLiteralErrors.symbols index b31666caafb91..1922e1957ffba 100644 --- a/tests/baselines/reference/objectLiteralErrors.symbols +++ b/tests/baselines/reference/objectLiteralErrors.symbols @@ -183,7 +183,7 @@ var f17 = { a: 0, get b() { return 1; }, get a() { return 0; } }; >b : Symbol(b, Decl(objectLiteralErrors.ts, 38, 17)) >a : Symbol(a, Decl(objectLiteralErrors.ts, 38, 40)) -// Get and set accessor with mismatched type annotations +// Get and set accessor with mismatched type annotations (only g2 is an error after #43662 implemented) var g1 = { get a(): number { return 4; }, set a(n: string) { } }; >g1 : Symbol(g1, Decl(objectLiteralErrors.ts, 41, 3)) >a : Symbol(a, Decl(objectLiteralErrors.ts, 41, 10), Decl(objectLiteralErrors.ts, 41, 41)) diff --git a/tests/baselines/reference/objectLiteralErrors.types b/tests/baselines/reference/objectLiteralErrors.types index e3ff3cf613c5e..b1a383cf2aaca 100644 --- a/tests/baselines/reference/objectLiteralErrors.types +++ b/tests/baselines/reference/objectLiteralErrors.types @@ -293,7 +293,7 @@ var f17 = { a: 0, get b() { return 1; }, get a() { return 0; } }; >a : number >0 : 0 -// Get and set accessor with mismatched type annotations +// Get and set accessor with mismatched type annotations (only g2 is an error after #43662 implemented) var g1 = { get a(): number { return 4; }, set a(n: string) { } }; >g1 : { a: number; } >{ get a(): number { return 4; }, set a(n: string) { } } : { a: number; } diff --git a/tests/cases/compiler/abstractPropertyNegative.ts b/tests/cases/compiler/abstractPropertyNegative.ts index 16c09b105734b..6350111b395b7 100644 --- a/tests/cases/compiler/abstractPropertyNegative.ts +++ b/tests/cases/compiler/abstractPropertyNegative.ts @@ -9,7 +9,7 @@ abstract class B implements A { abstract get readonlyProp(): string; abstract m(): string; abstract get mismatch(): string; - abstract set mismatch(val: number); // error, not same type + abstract set mismatch(val: number); } class C extends B { readonly ro = "readonly please"; diff --git a/tests/cases/compiler/divergentAccessorsTypes6.ts b/tests/cases/compiler/divergentAccessorsTypes6.ts new file mode 100644 index 0000000000000..892ad965dd903 --- /dev/null +++ b/tests/cases/compiler/divergentAccessorsTypes6.ts @@ -0,0 +1,37 @@ +// @lib: esnext,dom +// @declaration: true + +export {}; + +interface Element { + get style(): CSSStyleDeclaration; + set style(cssText: string); +} + +declare const element: Element; +element.style = "color: red"; +element.style.animationTimingFunction; +element.style = element.style; // error + +// Now that we don't check for getter/setter assignability, we should +// ensure the setter annotation is actually checked even if it's never observed. + +type Fail = T; +interface I1 { + get x(): number; + set x(value: Fail); +} +const o1 = { + get x(): number { return 0; }, + set x(value: Fail) {} +} + +// A setter annotation still implies the getter return type. + +const o2 = { + get p1() { return 0; }, // error - no annotation means type is implied from the setter annotation + set p1(value: string) {}, + + get p2(): number { return 0; }, // ok - explicit annotation + set p2(value: string) {}, +}; diff --git a/tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts b/tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts index 8e8d33e78aaf0..43543febc4c95 100644 --- a/tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts +++ b/tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts @@ -40,7 +40,7 @@ var f15 = { "100": 0, get 1e2() { return 0; } }; var f16 = { 0x20: 0, get 3.2e1() { return 0; } }; var f17 = { a: 0, get b() { return 1; }, get a() { return 0; } }; -// Get and set accessor with mismatched type annotations +// Get and set accessor with mismatched type annotations (only g2 is an error after #43662 implemented) var g1 = { get a(): number { return 4; }, set a(n: string) { } }; var g2 = { get a() { return 4; }, set a(n: string) { } }; var g3 = { get a(): number { return undefined; }, set a(n: string) { } }; diff --git a/tests/cases/fourslash/incrementalResolveAccessor.ts b/tests/cases/fourslash/incrementalResolveAccessor.ts index 456b7e3a69278..7932fa9b68ac4 100644 --- a/tests/cases/fourslash/incrementalResolveAccessor.ts +++ b/tests/cases/fourslash/incrementalResolveAccessor.ts @@ -16,4 +16,4 @@ verify.quickInfoAt("1", "var b: string"); // TypeCheck -verify.numberOfErrorsInCurrentFile(2); \ No newline at end of file +verify.numberOfErrorsInCurrentFile(1); \ No newline at end of file