From a1535533e7da2e8688c5f3f4b6cbc979633e5ecf Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 3 Nov 2014 09:30:49 -0800 Subject: [PATCH] Tests for source (S) of subtype is union type (U) A union type U is a subtype of a type T if each type in U is a subtype of T --- ...IfEveryConstituentTypeIsSubtype.errors.txt | 239 ++++++++++++++++++ ...nSubtypeIfEveryConstituentTypeIsSubtype.js | 180 +++++++++++++ ...nSubtypeIfEveryConstituentTypeIsSubtype.ts | 143 +++++++++++ 3 files changed, 562 insertions(+) create mode 100644 tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.errors.txt create mode 100644 tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.js create mode 100644 tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts diff --git a/tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.errors.txt b/tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.errors.txt new file mode 100644 index 0000000000..013b5d9a99 --- /dev/null +++ b/tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.errors.txt @@ -0,0 +1,239 @@ +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(15,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(21,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'string'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(22,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'string'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(28,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'boolean'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(29,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'boolean'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(35,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'Date'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(36,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'Date'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(42,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'RegExp'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(43,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'RegExp'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(49,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '{ bar: number; }'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(50,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '{ bar: number; }'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(56,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number[]'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(57,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'number[]'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(63,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'I8'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(64,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'I8'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(70,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(71,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(77,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A2'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(78,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A2'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(84,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '(x: any) => number'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(85,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '(x: any) => number'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(91,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '(x: T) => T'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(92,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '(x: T) => T'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(99,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'E2'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(100,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'E2'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(110,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof f'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(111,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof f'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(121,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof c'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(122,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof c'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(128,5): error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'T'. +tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts(129,5): error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'T'. + + +==== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts (31 errors) ==== + enum e { + e1, + e2 + } + + // A union type U is a subtype of a type T if each type in U is a subtype of T + interface I { + [x: string]: any; + foo: string | number; // ok + foo2: e | number; // ok + } + interface I2 { + [x: string]: number; + // S is union type and each constituent type of S is a subtype of T + foo: string | number; // error string is not subtype of number + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number'. + foo2: e | number; // ok e and number both subtype of number + } + + interface I3 { + [x: string]: string; + foo: string | number; // error numer is not subtype of string + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'string'. + foo2: e | number; // error e and number both not subtype of string + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'string'. + } + + // error cases + interface I4 { + [x: string]: boolean; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'boolean'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'boolean'. + } + + + interface I5 { + [x: string]: Date; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'Date'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'Date'. + } + + + interface I6 { + [x: string]: RegExp; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'RegExp'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'RegExp'. + } + + + interface I7 { + [x: string]: { bar: number }; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '{ bar: number; }'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '{ bar: number; }'. + } + + + interface I8 { + [x: string]: number[]; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'number[]'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'number[]'. + } + + + interface I9 { + [x: string]: I8; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'I8'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'I8'. + } + + class A { foo: number; } + interface I10 { + [x: string]: A; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A'. + } + + class A2 { foo: T; } + interface I11 { + [x: string]: A2; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'A2'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'A2'. + } + + + interface I12 { + [x: string]: (x) => number; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '(x: any) => number'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '(x: any) => number'. + } + + + interface I13 { + [x: string]: (x: T) => T; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type '(x: T) => T'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type '(x: T) => T'. + } + + + enum E2 { A } + interface I14 { + [x: string]: E2; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'E2'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'E2'. + } + + + function f() { } + module f { + export var bar = 1; + } + interface I15 { + [x: string]: typeof f; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof f'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof f'. + } + + + class c { baz: string } + module c { + export var bar = 1; + } + interface I16 { + [x: string]: typeof c; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'typeof c'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'typeof c'. + } + + + interface I17 { + [x: string]: T; + foo: string | number; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo' of type 'string | number' is not assignable to string index type 'T'. + foo2: e | number; + ~~~~~~~~~~~~~~~~~ +!!! error TS2411: Property 'foo2' of type 'number | e' is not assignable to string index type 'T'. + } + + interface I19 { + [x: string]: Object; + foo: string | number; + foo2: e | number; + } + + + interface I20 { + [x: string]: {}; + foo: string | number; + foo2: e | number; + } \ No newline at end of file diff --git a/tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.js b/tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.js new file mode 100644 index 0000000000..0c9ffeb565 --- /dev/null +++ b/tests/baselines/reference/unionSubtypeIfEveryConstituentTypeIsSubtype.js @@ -0,0 +1,180 @@ +//// [unionSubtypeIfEveryConstituentTypeIsSubtype.ts] +enum e { + e1, + e2 +} + +// A union type U is a subtype of a type T if each type in U is a subtype of T +interface I { + [x: string]: any; + foo: string | number; // ok + foo2: e | number; // ok +} +interface I2 { + [x: string]: number; + // S is union type and each constituent type of S is a subtype of T + foo: string | number; // error string is not subtype of number + foo2: e | number; // ok e and number both subtype of number +} + +interface I3 { + [x: string]: string; + foo: string | number; // error numer is not subtype of string + foo2: e | number; // error e and number both not subtype of string +} + +// error cases +interface I4 { + [x: string]: boolean; + foo: string | number; + foo2: e | number; +} + + +interface I5 { + [x: string]: Date; + foo: string | number; + foo2: e | number; +} + + +interface I6 { + [x: string]: RegExp; + foo: string | number; + foo2: e | number; +} + + +interface I7 { + [x: string]: { bar: number }; + foo: string | number; + foo2: e | number; +} + + +interface I8 { + [x: string]: number[]; + foo: string | number; + foo2: e | number; +} + + +interface I9 { + [x: string]: I8; + foo: string | number; + foo2: e | number; +} + +class A { foo: number; } +interface I10 { + [x: string]: A; + foo: string | number; + foo2: e | number; +} + +class A2 { foo: T; } +interface I11 { + [x: string]: A2; + foo: string | number; + foo2: e | number; +} + + +interface I12 { + [x: string]: (x) => number; + foo: string | number; + foo2: e | number; +} + + +interface I13 { + [x: string]: (x: T) => T; + foo: string | number; + foo2: e | number; +} + + +enum E2 { A } +interface I14 { + [x: string]: E2; + foo: string | number; + foo2: e | number; +} + + +function f() { } +module f { + export var bar = 1; +} +interface I15 { + [x: string]: typeof f; + foo: string | number; + foo2: e | number; +} + + +class c { baz: string } +module c { + export var bar = 1; +} +interface I16 { + [x: string]: typeof c; + foo: string | number; + foo2: e | number; +} + + +interface I17 { + [x: string]: T; + foo: string | number; + foo2: e | number; +} + +interface I19 { + [x: string]: Object; + foo: string | number; + foo2: e | number; +} + + +interface I20 { + [x: string]: {}; + foo: string | number; + foo2: e | number; +} + +//// [unionSubtypeIfEveryConstituentTypeIsSubtype.js] +var e; +(function (e) { + e[e["e1"] = 0] = "e1"; + e[e["e2"] = 1] = "e2"; +})(e || (e = {})); +var A = (function () { + function A() { + } + return A; +})(); +var A2 = (function () { + function A2() { + } + return A2; +})(); +var E2; +(function (E2) { + E2[E2["A"] = 0] = "A"; +})(E2 || (E2 = {})); +function f() { +} +var f; +(function (f) { + f.bar = 1; +})(f || (f = {})); +var c = (function () { + function c() { + } + return c; +})(); +var c; +(function (c) { + c.bar = 1; +})(c || (c = {})); diff --git a/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts new file mode 100644 index 0000000000..7caa26a295 --- /dev/null +++ b/tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/unionSubtypeIfEveryConstituentTypeIsSubtype.ts @@ -0,0 +1,143 @@ +enum e { + e1, + e2 +} + +// A union type U is a subtype of a type T if each type in U is a subtype of T +interface I { + [x: string]: any; + foo: string | number; // ok + foo2: e | number; // ok +} +interface I2 { + [x: string]: number; + // S is union type and each constituent type of S is a subtype of T + foo: string | number; // error string is not subtype of number + foo2: e | number; // ok e and number both subtype of number +} + +interface I3 { + [x: string]: string; + foo: string | number; // error numer is not subtype of string + foo2: e | number; // error e and number both not subtype of string +} + +// error cases +interface I4 { + [x: string]: boolean; + foo: string | number; + foo2: e | number; +} + + +interface I5 { + [x: string]: Date; + foo: string | number; + foo2: e | number; +} + + +interface I6 { + [x: string]: RegExp; + foo: string | number; + foo2: e | number; +} + + +interface I7 { + [x: string]: { bar: number }; + foo: string | number; + foo2: e | number; +} + + +interface I8 { + [x: string]: number[]; + foo: string | number; + foo2: e | number; +} + + +interface I9 { + [x: string]: I8; + foo: string | number; + foo2: e | number; +} + +class A { foo: number; } +interface I10 { + [x: string]: A; + foo: string | number; + foo2: e | number; +} + +class A2 { foo: T; } +interface I11 { + [x: string]: A2; + foo: string | number; + foo2: e | number; +} + + +interface I12 { + [x: string]: (x) => number; + foo: string | number; + foo2: e | number; +} + + +interface I13 { + [x: string]: (x: T) => T; + foo: string | number; + foo2: e | number; +} + + +enum E2 { A } +interface I14 { + [x: string]: E2; + foo: string | number; + foo2: e | number; +} + + +function f() { } +module f { + export var bar = 1; +} +interface I15 { + [x: string]: typeof f; + foo: string | number; + foo2: e | number; +} + + +class c { baz: string } +module c { + export var bar = 1; +} +interface I16 { + [x: string]: typeof c; + foo: string | number; + foo2: e | number; +} + + +interface I17 { + [x: string]: T; + foo: string | number; + foo2: e | number; +} + +interface I19 { + [x: string]: Object; + foo: string | number; + foo2: e | number; +} + + +interface I20 { + [x: string]: {}; + foo: string | number; + foo2: e | number; +} \ No newline at end of file