Skip to content

Commit

Permalink
Make Omit alias a separate type (#31115)
Browse files Browse the repository at this point in the history
Make `Omit` alias a separate type
  • Loading branch information
DanielRosenwasser committed Apr 25, 2019
2 parents b45df89 + a34f988 commit 58898f4
Show file tree
Hide file tree
Showing 10 changed files with 324 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/lib/es5.d.ts
Expand Up @@ -1446,7 +1446,9 @@ type Extract<T, U> = T extends U ? T : never;
/**
* Construct a type with the properties of T except for those in type K.
*/
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type Omit<T, K extends keyof any> = {
[P in Exclude<keyof T, K>]: T[P]
};

/**
* Exclude null and undefined from T
Expand Down
27 changes: 27 additions & 0 deletions tests/baselines/reference/omitTypeTestErrors01.errors.txt
@@ -0,0 +1,27 @@
tests/cases/compiler/omitTypeTestErrors01.ts(11,16): error TS2339: Property 'c' does not exist on type 'Omit<Foo, "c">'.
tests/cases/compiler/omitTypeTestErrors01.ts(15,16): error TS2339: Property 'b' does not exist on type 'Omit<Foo, "c" | "b">'.


==== tests/cases/compiler/omitTypeTestErrors01.ts (2 errors) ====
interface Foo {
a: string;
b: number;
c: boolean;
}

export type Bar = Omit<Foo, "c">;
export type Baz = Omit<Foo, "b" | "c">;

export function getBarC(bar: Bar) {
return bar.c;
~
!!! error TS2339: Property 'c' does not exist on type 'Omit<Foo, "c">'.
}

export function getBazB(baz: Baz) {
return baz.b;
~
!!! error TS2339: Property 'b' does not exist on type 'Omit<Foo, "c" | "b">'.
}


44 changes: 44 additions & 0 deletions tests/baselines/reference/omitTypeTestErrors01.js
@@ -0,0 +1,44 @@
//// [omitTypeTestErrors01.ts]
interface Foo {
a: string;
b: number;
c: boolean;
}

export type Bar = Omit<Foo, "c">;
export type Baz = Omit<Foo, "b" | "c">;

export function getBarC(bar: Bar) {
return bar.c;
}

export function getBazB(baz: Baz) {
return baz.b;
}



//// [omitTypeTestErrors01.js]
"use strict";
exports.__esModule = true;
function getBarC(bar) {
return bar.c;
}
exports.getBarC = getBarC;
function getBazB(baz) {
return baz.b;
}
exports.getBazB = getBazB;


//// [omitTypeTestErrors01.d.ts]
interface Foo {
a: string;
b: number;
c: boolean;
}
export declare type Bar = Omit<Foo, "c">;
export declare type Baz = Omit<Foo, "b" | "c">;
export declare function getBarC(bar: Bar): any;
export declare function getBazB(baz: Baz): any;
export {};
43 changes: 43 additions & 0 deletions tests/baselines/reference/omitTypeTestErrors01.symbols
@@ -0,0 +1,43 @@
=== tests/cases/compiler/omitTypeTestErrors01.ts ===
interface Foo {
>Foo : Symbol(Foo, Decl(omitTypeTestErrors01.ts, 0, 0))

a: string;
>a : Symbol(Foo.a, Decl(omitTypeTestErrors01.ts, 0, 15))

b: number;
>b : Symbol(Foo.b, Decl(omitTypeTestErrors01.ts, 1, 14))

c: boolean;
>c : Symbol(Foo.c, Decl(omitTypeTestErrors01.ts, 2, 14))
}

export type Bar = Omit<Foo, "c">;
>Bar : Symbol(Bar, Decl(omitTypeTestErrors01.ts, 4, 1))
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
>Foo : Symbol(Foo, Decl(omitTypeTestErrors01.ts, 0, 0))

export type Baz = Omit<Foo, "b" | "c">;
>Baz : Symbol(Baz, Decl(omitTypeTestErrors01.ts, 6, 33))
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
>Foo : Symbol(Foo, Decl(omitTypeTestErrors01.ts, 0, 0))

export function getBarC(bar: Bar) {
>getBarC : Symbol(getBarC, Decl(omitTypeTestErrors01.ts, 7, 39))
>bar : Symbol(bar, Decl(omitTypeTestErrors01.ts, 9, 24))
>Bar : Symbol(Bar, Decl(omitTypeTestErrors01.ts, 4, 1))

return bar.c;
>bar : Symbol(bar, Decl(omitTypeTestErrors01.ts, 9, 24))
}

export function getBazB(baz: Baz) {
>getBazB : Symbol(getBazB, Decl(omitTypeTestErrors01.ts, 11, 1))
>baz : Symbol(baz, Decl(omitTypeTestErrors01.ts, 13, 24))
>Baz : Symbol(Baz, Decl(omitTypeTestErrors01.ts, 6, 33))

return baz.b;
>baz : Symbol(baz, Decl(omitTypeTestErrors01.ts, 13, 24))
}


39 changes: 39 additions & 0 deletions tests/baselines/reference/omitTypeTestErrors01.types
@@ -0,0 +1,39 @@
=== tests/cases/compiler/omitTypeTestErrors01.ts ===
interface Foo {
a: string;
>a : string

b: number;
>b : number

c: boolean;
>c : boolean
}

export type Bar = Omit<Foo, "c">;
>Bar : Omit<Foo, "c">

export type Baz = Omit<Foo, "b" | "c">;
>Baz : Omit<Foo, "c" | "b">

export function getBarC(bar: Bar) {
>getBarC : (bar: Omit<Foo, "c">) => any
>bar : Omit<Foo, "c">

return bar.c;
>bar.c : any
>bar : Omit<Foo, "c">
>c : any
}

export function getBazB(baz: Baz) {
>getBazB : (baz: Omit<Foo, "c" | "b">) => any
>baz : Omit<Foo, "c" | "b">

return baz.b;
>baz.b : any
>baz : Omit<Foo, "c" | "b">
>b : any
}


44 changes: 44 additions & 0 deletions tests/baselines/reference/omitTypeTests01.js
@@ -0,0 +1,44 @@
//// [omitTypeTests01.ts]
interface Foo {
a: string;
b: number;
c: boolean;
}

export type Bar = Omit<Foo, "c">;
export type Baz = Omit<Foo, "b" | "c">;

export function getBarA(bar: Bar) {
return bar.a;
}

export function getBazA(baz: Baz) {
return baz.a;
}



//// [omitTypeTests01.js]
"use strict";
exports.__esModule = true;
function getBarA(bar) {
return bar.a;
}
exports.getBarA = getBarA;
function getBazA(baz) {
return baz.a;
}
exports.getBazA = getBazA;


//// [omitTypeTests01.d.ts]
interface Foo {
a: string;
b: number;
c: boolean;
}
export declare type Bar = Omit<Foo, "c">;
export declare type Baz = Omit<Foo, "b" | "c">;
export declare function getBarA(bar: Bar): string;
export declare function getBazA(baz: Baz): string;
export {};
47 changes: 47 additions & 0 deletions tests/baselines/reference/omitTypeTests01.symbols
@@ -0,0 +1,47 @@
=== tests/cases/compiler/omitTypeTests01.ts ===
interface Foo {
>Foo : Symbol(Foo, Decl(omitTypeTests01.ts, 0, 0))

a: string;
>a : Symbol(Foo.a, Decl(omitTypeTests01.ts, 0, 15))

b: number;
>b : Symbol(Foo.b, Decl(omitTypeTests01.ts, 1, 14))

c: boolean;
>c : Symbol(Foo.c, Decl(omitTypeTests01.ts, 2, 14))
}

export type Bar = Omit<Foo, "c">;
>Bar : Symbol(Bar, Decl(omitTypeTests01.ts, 4, 1))
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
>Foo : Symbol(Foo, Decl(omitTypeTests01.ts, 0, 0))

export type Baz = Omit<Foo, "b" | "c">;
>Baz : Symbol(Baz, Decl(omitTypeTests01.ts, 6, 33))
>Omit : Symbol(Omit, Decl(lib.es5.d.ts, --, --))
>Foo : Symbol(Foo, Decl(omitTypeTests01.ts, 0, 0))

export function getBarA(bar: Bar) {
>getBarA : Symbol(getBarA, Decl(omitTypeTests01.ts, 7, 39))
>bar : Symbol(bar, Decl(omitTypeTests01.ts, 9, 24))
>Bar : Symbol(Bar, Decl(omitTypeTests01.ts, 4, 1))

return bar.a;
>bar.a : Symbol(a)
>bar : Symbol(bar, Decl(omitTypeTests01.ts, 9, 24))
>a : Symbol(a)
}

export function getBazA(baz: Baz) {
>getBazA : Symbol(getBazA, Decl(omitTypeTests01.ts, 11, 1))
>baz : Symbol(baz, Decl(omitTypeTests01.ts, 13, 24))
>Baz : Symbol(Baz, Decl(omitTypeTests01.ts, 6, 33))

return baz.a;
>baz.a : Symbol(a)
>baz : Symbol(baz, Decl(omitTypeTests01.ts, 13, 24))
>a : Symbol(a)
}


39 changes: 39 additions & 0 deletions tests/baselines/reference/omitTypeTests01.types
@@ -0,0 +1,39 @@
=== tests/cases/compiler/omitTypeTests01.ts ===
interface Foo {
a: string;
>a : string

b: number;
>b : number

c: boolean;
>c : boolean
}

export type Bar = Omit<Foo, "c">;
>Bar : Omit<Foo, "c">

export type Baz = Omit<Foo, "b" | "c">;
>Baz : Omit<Foo, "c" | "b">

export function getBarA(bar: Bar) {
>getBarA : (bar: Omit<Foo, "c">) => string
>bar : Omit<Foo, "c">

return bar.a;
>bar.a : string
>bar : Omit<Foo, "c">
>a : string
}

export function getBazA(baz: Baz) {
>getBazA : (baz: Omit<Foo, "c" | "b">) => string
>baz : Omit<Foo, "c" | "b">

return baz.a;
>baz.a : string
>baz : Omit<Foo, "c" | "b">
>a : string
}


19 changes: 19 additions & 0 deletions tests/cases/compiler/omitTypeTestErrors01.ts
@@ -0,0 +1,19 @@
// @declaration: true

interface Foo {
a: string;
b: number;
c: boolean;
}

export type Bar = Omit<Foo, "c">;
export type Baz = Omit<Foo, "b" | "c">;

export function getBarC(bar: Bar) {
return bar.c;
}

export function getBazB(baz: Baz) {
return baz.b;
}

19 changes: 19 additions & 0 deletions tests/cases/compiler/omitTypeTests01.ts
@@ -0,0 +1,19 @@
// @declaration: true

interface Foo {
a: string;
b: number;
c: boolean;
}

export type Bar = Omit<Foo, "c">;
export type Baz = Omit<Foo, "b" | "c">;

export function getBarA(bar: Bar) {
return bar.a;
}

export function getBazA(baz: Baz) {
return baz.a;
}

0 comments on commit 58898f4

Please sign in to comment.