fix(55168): Computed properties do not respect setter signatures (#55178)

This commit is contained in:
Oleksandr T. 2024-10-22 23:10:55 +03:00 committed by GitHub
parent e25abe34ae
commit 241a6c9589
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 229 additions and 0 deletions

View File

@ -0,0 +1,32 @@
//// [tests/cases/compiler/computedPropertiesWithSetterAssignment.ts] ////
//// [a.ts]
const k = Symbol();
const enum Props {
k = 'k',
}
interface Foo {
get k(): Set<string>;
set k(v: Iterable<string>);
get [k](): Set<string>;
set [k](v: Iterable<string>);
}
declare const foo: Foo;
foo.k = ['foo'];
foo['k'] = ['foo'];
foo[Props.k] = ['foo'];
foo[k] = ['foo'];
//// [a.js]
"use strict";
const k = Symbol();
foo.k = ['foo'];
foo['k'] = ['foo'];
foo["k" /* Props.k */] = ['foo'];
foo[k] = ['foo'];

View File

@ -0,0 +1,61 @@
//// [tests/cases/compiler/computedPropertiesWithSetterAssignment.ts] ////
=== /a.ts ===
const k = Symbol();
>k : Symbol(k, Decl(a.ts, 0, 5))
>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --))
const enum Props {
>Props : Symbol(Props, Decl(a.ts, 0, 19))
k = 'k',
>k : Symbol(Props.k, Decl(a.ts, 2, 18))
}
interface Foo {
>Foo : Symbol(Foo, Decl(a.ts, 4, 1))
get k(): Set<string>;
>k : Symbol(Foo.k, Decl(a.ts, 6, 15), Decl(a.ts, 7, 25))
>Set : Symbol(Set, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.esnext.collection.d.ts, --, --))
set k(v: Iterable<string>);
>k : Symbol(Foo.k, Decl(a.ts, 6, 15), Decl(a.ts, 7, 25))
>v : Symbol(v, Decl(a.ts, 8, 10))
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
get [k](): Set<string>;
>[k] : Symbol(Foo[k], Decl(a.ts, 8, 31), Decl(a.ts, 10, 27))
>k : Symbol(k, Decl(a.ts, 0, 5))
>Set : Symbol(Set, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.esnext.collection.d.ts, --, --))
set [k](v: Iterable<string>);
>[k] : Symbol(Foo[k], Decl(a.ts, 8, 31), Decl(a.ts, 10, 27))
>k : Symbol(k, Decl(a.ts, 0, 5))
>v : Symbol(v, Decl(a.ts, 11, 12))
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
}
declare const foo: Foo;
>foo : Symbol(foo, Decl(a.ts, 14, 13))
>Foo : Symbol(Foo, Decl(a.ts, 4, 1))
foo.k = ['foo'];
>foo.k : Symbol(Foo.k, Decl(a.ts, 6, 15), Decl(a.ts, 7, 25))
>foo : Symbol(foo, Decl(a.ts, 14, 13))
>k : Symbol(Foo.k, Decl(a.ts, 6, 15), Decl(a.ts, 7, 25))
foo['k'] = ['foo'];
>foo : Symbol(foo, Decl(a.ts, 14, 13))
>'k' : Symbol(Foo.k, Decl(a.ts, 6, 15), Decl(a.ts, 7, 25))
foo[Props.k] = ['foo'];
>foo : Symbol(foo, Decl(a.ts, 14, 13))
>Props.k : Symbol(Props.k, Decl(a.ts, 2, 18))
>Props : Symbol(Props, Decl(a.ts, 0, 19))
>k : Symbol(Props.k, Decl(a.ts, 2, 18))
foo[k] = ['foo'];
>foo : Symbol(foo, Decl(a.ts, 14, 13))
>k : Symbol(k, Decl(a.ts, 0, 5))

View File

@ -0,0 +1,112 @@
//// [tests/cases/compiler/computedPropertiesWithSetterAssignment.ts] ////
=== /a.ts ===
const k = Symbol();
>k : unique symbol
> : ^^^^^^^^^^^^^
>Symbol() : unique symbol
> : ^^^^^^^^^^^^^
>Symbol : SymbolConstructor
> : ^^^^^^^^^^^^^^^^^
const enum Props {
>Props : Props
> : ^^^^^
k = 'k',
>k : Props.k
> : ^^^^^^^
>'k' : "k"
> : ^^^
}
interface Foo {
get k(): Set<string>;
>k : Set<string>
> : ^^^^^^^^^^^
set k(v: Iterable<string>);
>k : Set<string>
> : ^^^^^^^^^^^
>v : Iterable<string>
> : ^^^^^^^^^^^^^^^^
get [k](): Set<string>;
>[k] : Set<string>
> : ^^^^^^^^^^^
>k : unique symbol
> : ^^^^^^^^^^^^^
set [k](v: Iterable<string>);
>[k] : Set<string>
> : ^^^^^^^^^^^
>k : unique symbol
> : ^^^^^^^^^^^^^
>v : Iterable<string>
> : ^^^^^^^^^^^^^^^^
}
declare const foo: Foo;
>foo : Foo
> : ^^^
foo.k = ['foo'];
>foo.k = ['foo'] : string[]
> : ^^^^^^^^
>foo.k : Iterable<string>
> : ^^^^^^^^^^^^^^^^
>foo : Foo
> : ^^^
>k : Iterable<string>
> : ^^^^^^^^^^^^^^^^
>['foo'] : string[]
> : ^^^^^^^^
>'foo' : "foo"
> : ^^^^^
foo['k'] = ['foo'];
>foo['k'] = ['foo'] : string[]
> : ^^^^^^^^
>foo['k'] : Iterable<string>
> : ^^^^^^^^^^^^^^^^
>foo : Foo
> : ^^^
>'k' : "k"
> : ^^^
>['foo'] : string[]
> : ^^^^^^^^
>'foo' : "foo"
> : ^^^^^
foo[Props.k] = ['foo'];
>foo[Props.k] = ['foo'] : string[]
> : ^^^^^^^^
>foo[Props.k] : Iterable<string>
> : ^^^^^^^^^^^^^^^^
>foo : Foo
> : ^^^
>Props.k : Props
> : ^^^^^
>Props : typeof Props
> : ^^^^^^^^^^^^
>k : Props
> : ^^^^^
>['foo'] : string[]
> : ^^^^^^^^
>'foo' : "foo"
> : ^^^^^
foo[k] = ['foo'];
>foo[k] = ['foo'] : string[]
> : ^^^^^^^^
>foo[k] : Iterable<string>
> : ^^^^^^^^^^^^^^^^
>foo : Foo
> : ^^^
>k : unique symbol
> : ^^^^^^^^^^^^^
>['foo'] : string[]
> : ^^^^^^^^
>'foo' : "foo"
> : ^^^^^

View File

@ -0,0 +1,24 @@
// @target: esnext
// @strict: true
// @filename: /a.ts
const k = Symbol();
const enum Props {
k = 'k',
}
interface Foo {
get k(): Set<string>;
set k(v: Iterable<string>);
get [k](): Set<string>;
set [k](v: Iterable<string>);
}
declare const foo: Foo;
foo.k = ['foo'];
foo['k'] = ['foo'];
foo[Props.k] = ['foo'];
foo[k] = ['foo'];