diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index 827c2aaddd50c..f2be6716c7299 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -1446,9 +1446,7 @@ type Extract = T extends U ? T : never; /** * Construct a type with the properties of T except for those in type K. */ -type Omit = { - [P in Exclude]: T[P] -}; +type Omit = Pick>; /** * Exclude null and undefined from T diff --git a/tests/baselines/reference/genericIsNeverEmptyObject.types b/tests/baselines/reference/genericIsNeverEmptyObject.types index 3a49e723e7600..5d2b4d9d57f53 100644 --- a/tests/baselines/reference/genericIsNeverEmptyObject.types +++ b/tests/baselines/reference/genericIsNeverEmptyObject.types @@ -2,18 +2,18 @@ // Repro from #29067 function test(obj: T) { ->test : (obj: T) => Omit & { b: string; } +>test : (obj: T) => Pick> & { b: string; } >a : string >obj : T let { a, ...rest } = obj; >a : string ->rest : Omit +>rest : Pick> >obj : T return { ...rest, b: a }; ->{ ...rest, b: a } : Omit & { b: string; } ->rest : Omit +>{ ...rest, b: a } : Pick> & { b: string; } +>rest : Pick> >b : string >a : string } @@ -30,7 +30,7 @@ let o2: { b: string, x: number } = test(o1); >o2 : { b: string; x: number; } >b : string >x : number ->test(o1) : Omit<{ a: string; x: number; }, "a"> & { b: string; } ->test : (obj: T) => Omit & { b: string; } +>test(o1) : Pick<{ a: string; x: number; }, "x"> & { b: string; } +>test : (obj: T) => Pick> & { b: string; } >o1 : { a: string; x: number; } diff --git a/tests/baselines/reference/genericObjectRest.types b/tests/baselines/reference/genericObjectRest.types index ba5145dccba19..c2fcaad7cb87c 100644 --- a/tests/baselines/reference/genericObjectRest.types +++ b/tests/baselines/reference/genericObjectRest.types @@ -16,7 +16,7 @@ function f1(obj: T) { let { a: a1, ...r1 } = obj; >a : any >a1 : string ->r1 : Omit +>r1 : Pick> >obj : T let { a: a2, b: b2, ...r2 } = obj; @@ -24,24 +24,24 @@ function f1(obj: T) { >a2 : string >b : any >b2 : number ->r2 : Omit +>r2 : Pick> >obj : T let { 'a': a3, ...r3 } = obj; >a3 : string ->r3 : Omit +>r3 : Pick> >obj : T let { ['a']: a4, ...r4 } = obj; >'a' : "a" >a4 : string ->r4 : Omit +>r4 : Pick> >obj : T let { [a]: a5, ...r5 } = obj; >a : "a" >a5 : string ->r5 : Omit +>r5 : Pick> >obj : T } @@ -68,7 +68,7 @@ function f2(obj: T) { >a1 : string >sb : unique symbol >b1 : number ->r1 : Omit +>r1 : Pick> >obj : T } @@ -83,7 +83,7 @@ function f3(obj: T, k1: K1, k2: K2) { >a1 : T[K1] >k2 : K2 >a2 : T[K2] ->r1 : Omit +>r1 : Pick> >obj : T } @@ -104,7 +104,7 @@ function f4(obj: Item, k1: K1, k2: >a1 : Item[K1] >k2 : K2 >a2 : Item[K2] ->r1 : Omit +>r1 : Pick | Exclude<"b", K1 | K2> | Exclude<"c", K1 | K2>> >obj : Item } diff --git a/tests/baselines/reference/literalTypeWidening.types b/tests/baselines/reference/literalTypeWidening.types index 81db0bfc36f68..95bde9a08ac3d 100644 --- a/tests/baselines/reference/literalTypeWidening.types +++ b/tests/baselines/reference/literalTypeWidening.types @@ -443,14 +443,14 @@ function test(obj: T): T { let { a, ...rest } = obj; >a : string ->rest : Omit +>rest : Pick> >obj : T return { a: 'hello', ...rest } as T; >{ a: 'hello', ...rest } as T : T ->{ a: 'hello', ...rest } : { a: string; } & Omit +>{ a: 'hello', ...rest } : { a: string; } & Pick> >a : string >'hello' : "hello" ->rest : Omit +>rest : Pick> } diff --git a/tests/baselines/reference/mappedTypeConstraints.symbols b/tests/baselines/reference/mappedTypeConstraints.symbols index 4a793fd0dc388..3601ffc3de848 100644 --- a/tests/baselines/reference/mappedTypeConstraints.symbols +++ b/tests/baselines/reference/mappedTypeConstraints.symbols @@ -132,9 +132,9 @@ const modifier = (targetProps: T) => { >targetProps : Symbol(targetProps, Decl(mappedTypeConstraints.ts, 30, 41)) rest.foo; ->rest.foo : Symbol(foo) +>rest.foo : Symbol(foo, Decl(mappedTypeConstraints.ts, 25, 20)) >rest : Symbol(rest, Decl(mappedTypeConstraints.ts, 31, 13)) ->foo : Symbol(foo) +>foo : Symbol(foo, Decl(mappedTypeConstraints.ts, 25, 20)) }; diff --git a/tests/baselines/reference/mappedTypeConstraints.types b/tests/baselines/reference/mappedTypeConstraints.types index 98ae325e6be91..3e42e2a2e9800 100644 --- a/tests/baselines/reference/mappedTypeConstraints.types +++ b/tests/baselines/reference/mappedTypeConstraints.types @@ -98,12 +98,12 @@ const modifier = (targetProps: T) => { let {bar, ...rest} = targetProps; >bar : string ->rest : Omit +>rest : Pick> >targetProps : T rest.foo; >rest.foo : T["foo"] ->rest : Omit +>rest : Pick> >foo : T["foo"] }; diff --git a/tests/baselines/reference/objectRestNegative.types b/tests/baselines/reference/objectRestNegative.types index 7cc174299e484..58ed1902f6dd4 100644 --- a/tests/baselines/reference/objectRestNegative.types +++ b/tests/baselines/reference/objectRestNegative.types @@ -36,18 +36,18 @@ function stillMustBeLast({ ...mustBeLast, a }: { a: number, b: string }): void { >b : string } function generic(t: T) { ->generic : (t: T) => Omit +>generic : (t: T) => Pick> >x : any >y : any >t : T let { x, ...rest } = t; >x : any ->rest : Omit +>rest : Pick> >t : T return rest; ->rest : Omit +>rest : Pick> } let rest: { b: string } diff --git a/tests/baselines/reference/omitTypeHelperModifiers01.errors.txt b/tests/baselines/reference/omitTypeHelperModifiers01.errors.txt new file mode 100644 index 0000000000000..e175a53703230 --- /dev/null +++ b/tests/baselines/reference/omitTypeHelperModifiers01.errors.txt @@ -0,0 +1,27 @@ +tests/cases/compiler/omitTypeHelperModifiers01.ts(16,7): error TS2540: Cannot assign to 'c' because it is a read-only property. + + +==== tests/cases/compiler/omitTypeHelperModifiers01.ts (1 errors) ==== + type A = { + a: number; + b?: string; + readonly c: boolean; + d: unknown; + }; + + type B = Omit; + + function f(x: B) { + const b = x.b; + x.b = "hello"; + x.b = undefined; + + const c = x.c; + x.c = true; + ~ +!!! error TS2540: Cannot assign to 'c' because it is a read-only property. + + const d = x.d; + x.d = d; + } + \ No newline at end of file diff --git a/tests/baselines/reference/omitTypeHelperModifiers01.js b/tests/baselines/reference/omitTypeHelperModifiers01.js new file mode 100644 index 0000000000000..4ddfbf0c6827e --- /dev/null +++ b/tests/baselines/reference/omitTypeHelperModifiers01.js @@ -0,0 +1,34 @@ +//// [omitTypeHelperModifiers01.ts] +type A = { + a: number; + b?: string; + readonly c: boolean; + d: unknown; +}; + +type B = Omit; + +function f(x: B) { + const b = x.b; + x.b = "hello"; + x.b = undefined; + + const c = x.c; + x.c = true; + + const d = x.d; + x.d = d; +} + + +//// [omitTypeHelperModifiers01.js] +"use strict"; +function f(x) { + var b = x.b; + x.b = "hello"; + x.b = undefined; + var c = x.c; + x.c = true; + var d = x.d; + x.d = d; +} diff --git a/tests/baselines/reference/omitTypeHelperModifiers01.symbols b/tests/baselines/reference/omitTypeHelperModifiers01.symbols new file mode 100644 index 0000000000000..39a3360678138 --- /dev/null +++ b/tests/baselines/reference/omitTypeHelperModifiers01.symbols @@ -0,0 +1,69 @@ +=== tests/cases/compiler/omitTypeHelperModifiers01.ts === +type A = { +>A : Symbol(A, Decl(omitTypeHelperModifiers01.ts, 0, 0)) + + a: number; +>a : Symbol(a, Decl(omitTypeHelperModifiers01.ts, 0, 10)) + + b?: string; +>b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) + + readonly c: boolean; +>c : Symbol(c, Decl(omitTypeHelperModifiers01.ts, 2, 15)) + + d: unknown; +>d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 3, 24)) + +}; + +type B = Omit; +>B : Symbol(B, Decl(omitTypeHelperModifiers01.ts, 5, 2)) +>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --)) +>A : Symbol(A, Decl(omitTypeHelperModifiers01.ts, 0, 0)) + +function f(x: B) { +>f : Symbol(f, Decl(omitTypeHelperModifiers01.ts, 7, 22)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>B : Symbol(B, Decl(omitTypeHelperModifiers01.ts, 5, 2)) + + const b = x.b; +>b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 10, 9)) +>x.b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) + + x.b = "hello"; +>x.b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) + + x.b = undefined; +>x.b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>b : Symbol(b, Decl(omitTypeHelperModifiers01.ts, 1, 14)) +>undefined : Symbol(undefined) + + const c = x.c; +>c : Symbol(c, Decl(omitTypeHelperModifiers01.ts, 14, 9)) +>x.c : Symbol(c, Decl(omitTypeHelperModifiers01.ts, 2, 15)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>c : Symbol(c, Decl(omitTypeHelperModifiers01.ts, 2, 15)) + + x.c = true; +>x.c : Symbol(c, Decl(omitTypeHelperModifiers01.ts, 2, 15)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>c : Symbol(c, Decl(omitTypeHelperModifiers01.ts, 2, 15)) + + const d = x.d; +>d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 17, 9)) +>x.d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 3, 24)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 3, 24)) + + x.d = d; +>x.d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 3, 24)) +>x : Symbol(x, Decl(omitTypeHelperModifiers01.ts, 9, 11)) +>d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 3, 24)) +>d : Symbol(d, Decl(omitTypeHelperModifiers01.ts, 17, 9)) +} + diff --git a/tests/baselines/reference/omitTypeHelperModifiers01.types b/tests/baselines/reference/omitTypeHelperModifiers01.types new file mode 100644 index 0000000000000..da5f61b698602 --- /dev/null +++ b/tests/baselines/reference/omitTypeHelperModifiers01.types @@ -0,0 +1,72 @@ +=== tests/cases/compiler/omitTypeHelperModifiers01.ts === +type A = { +>A : A + + a: number; +>a : number + + b?: string; +>b : string | undefined + + readonly c: boolean; +>c : boolean + + d: unknown; +>d : unknown + +}; + +type B = Omit; +>B : Pick + +function f(x: B) { +>f : (x: Pick) => void +>x : Pick + + const b = x.b; +>b : string | undefined +>x.b : string | undefined +>x : Pick +>b : string | undefined + + x.b = "hello"; +>x.b = "hello" : "hello" +>x.b : string | undefined +>x : Pick +>b : string | undefined +>"hello" : "hello" + + x.b = undefined; +>x.b = undefined : undefined +>x.b : string | undefined +>x : Pick +>b : string | undefined +>undefined : undefined + + const c = x.c; +>c : boolean +>x.c : boolean +>x : Pick +>c : boolean + + x.c = true; +>x.c = true : true +>x.c : any +>x : Pick +>c : any +>true : true + + const d = x.d; +>d : unknown +>x.d : unknown +>x : Pick +>d : unknown + + x.d = d; +>x.d = d : unknown +>x.d : unknown +>x : Pick +>d : unknown +>d : unknown +} + diff --git a/tests/baselines/reference/omitTypeTestErrors01.errors.txt b/tests/baselines/reference/omitTypeTestErrors01.errors.txt index 6b65e292b55f4..a66ab384b8935 100644 --- a/tests/baselines/reference/omitTypeTestErrors01.errors.txt +++ b/tests/baselines/reference/omitTypeTestErrors01.errors.txt @@ -1,5 +1,5 @@ -tests/cases/compiler/omitTypeTestErrors01.ts(11,16): error TS2339: Property 'c' does not exist on type 'Omit'. -tests/cases/compiler/omitTypeTestErrors01.ts(15,16): error TS2339: Property 'b' does not exist on type 'Omit'. +tests/cases/compiler/omitTypeTestErrors01.ts(11,16): error TS2339: Property 'c' does not exist on type 'Pick'. +tests/cases/compiler/omitTypeTestErrors01.ts(15,16): error TS2339: Property 'b' does not exist on type 'Pick'. ==== tests/cases/compiler/omitTypeTestErrors01.ts (2 errors) ==== @@ -15,13 +15,13 @@ tests/cases/compiler/omitTypeTestErrors01.ts(15,16): error TS2339: Property 'b' export function getBarC(bar: Bar) { return bar.c; ~ -!!! error TS2339: Property 'c' does not exist on type 'Omit'. +!!! error TS2339: Property 'c' does not exist on type 'Pick'. } export function getBazB(baz: Baz) { return baz.b; ~ -!!! error TS2339: Property 'b' does not exist on type 'Omit'. +!!! error TS2339: Property 'b' does not exist on type 'Pick'. } \ No newline at end of file diff --git a/tests/baselines/reference/omitTypeTestErrors01.types b/tests/baselines/reference/omitTypeTestErrors01.types index 4b286c2c89cbf..e7282016868d6 100644 --- a/tests/baselines/reference/omitTypeTestErrors01.types +++ b/tests/baselines/reference/omitTypeTestErrors01.types @@ -11,28 +11,28 @@ interface Foo { } export type Bar = Omit; ->Bar : Omit +>Bar : Pick export type Baz = Omit; ->Baz : Omit +>Baz : Pick export function getBarC(bar: Bar) { ->getBarC : (bar: Omit) => any ->bar : Omit +>getBarC : (bar: Pick) => any +>bar : Pick return bar.c; >bar.c : any ->bar : Omit +>bar : Pick >c : any } export function getBazB(baz: Baz) { ->getBazB : (baz: Omit) => any ->baz : Omit +>getBazB : (baz: Pick) => any +>baz : Pick return baz.b; >baz.b : any ->baz : Omit +>baz : Pick >b : any } diff --git a/tests/baselines/reference/omitTypeTests01.symbols b/tests/baselines/reference/omitTypeTests01.symbols index 93b492917855a..d614f65daff03 100644 --- a/tests/baselines/reference/omitTypeTests01.symbols +++ b/tests/baselines/reference/omitTypeTests01.symbols @@ -28,9 +28,9 @@ export function getBarA(bar: Bar) { >Bar : Symbol(Bar, Decl(omitTypeTests01.ts, 4, 1)) return bar.a; ->bar.a : Symbol(a) +>bar.a : Symbol(a, Decl(omitTypeTests01.ts, 0, 15)) >bar : Symbol(bar, Decl(omitTypeTests01.ts, 9, 24)) ->a : Symbol(a) +>a : Symbol(a, Decl(omitTypeTests01.ts, 0, 15)) } export function getBazA(baz: Baz) { @@ -39,9 +39,9 @@ export function getBazA(baz: Baz) { >Baz : Symbol(Baz, Decl(omitTypeTests01.ts, 6, 33)) return baz.a; ->baz.a : Symbol(a) +>baz.a : Symbol(a, Decl(omitTypeTests01.ts, 0, 15)) >baz : Symbol(baz, Decl(omitTypeTests01.ts, 13, 24)) ->a : Symbol(a) +>a : Symbol(a, Decl(omitTypeTests01.ts, 0, 15)) } diff --git a/tests/baselines/reference/omitTypeTests01.types b/tests/baselines/reference/omitTypeTests01.types index 549fcccc0f2f8..c07894ee2dcf6 100644 --- a/tests/baselines/reference/omitTypeTests01.types +++ b/tests/baselines/reference/omitTypeTests01.types @@ -11,28 +11,28 @@ interface Foo { } export type Bar = Omit; ->Bar : Omit +>Bar : Pick export type Baz = Omit; ->Baz : Omit +>Baz : Pick export function getBarA(bar: Bar) { ->getBarA : (bar: Omit) => string ->bar : Omit +>getBarA : (bar: Pick) => string +>bar : Pick return bar.a; >bar.a : string ->bar : Omit +>bar : Pick >a : string } export function getBazA(baz: Baz) { ->getBazA : (baz: Omit) => string ->baz : Omit +>getBazA : (baz: Pick) => string +>baz : Pick return baz.a; >baz.a : string ->baz : Omit +>baz : Pick >a : string } diff --git a/tests/cases/compiler/omitTypeHelperModifiers01.ts b/tests/cases/compiler/omitTypeHelperModifiers01.ts new file mode 100644 index 0000000000000..da76173d3657f --- /dev/null +++ b/tests/cases/compiler/omitTypeHelperModifiers01.ts @@ -0,0 +1,22 @@ +// @strict: true + +type A = { + a: number; + b?: string; + readonly c: boolean; + d: unknown; +}; + +type B = Omit; + +function f(x: B) { + const b = x.b; + x.b = "hello"; + x.b = undefined; + + const c = x.c; + x.c = true; + + const d = x.d; + x.d = d; +}