From 7e4715dfdc70db32e842fca3e4c80847a2cbb528 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 25 Aug 2016 12:11:06 -0700 Subject: [PATCH] Stole all of Nathan's tests. --- ...lementedPresentPropertyContextualTyping.ts | 10 +++ .../implementedPropertyContextualTyping1.ts | 72 +++++++++++++++++++ .../implementedPropertyContextualTyping2.ts | 23 ++++++ 3 files changed, 105 insertions(+) create mode 100644 tests/cases/conformance/expressions/contextualTyping/implementedPresentPropertyContextualTyping.ts create mode 100644 tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping1.ts create mode 100644 tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping2.ts diff --git a/tests/cases/conformance/expressions/contextualTyping/implementedPresentPropertyContextualTyping.ts b/tests/cases/conformance/expressions/contextualTyping/implementedPresentPropertyContextualTyping.ts new file mode 100644 index 00000000000..a3ac5f82e3f --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/implementedPresentPropertyContextualTyping.ts @@ -0,0 +1,10 @@ +// @strictNullChecks: true +interface X { + n: number +} +class C implements X { // error, n: undefined isn't assignable to n: number + n = undefined; +} +class C2 implements X { + n = null; +} diff --git a/tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping1.ts b/tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping1.ts new file mode 100644 index 00000000000..afbb75470de --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping1.ts @@ -0,0 +1,72 @@ +// @noImplicitAny: true +interface Event { + time: number; +} +interface Base { + superHandle: (e: Event) => number; +} +interface Listener extends Base { + handle: (e: Event) => void; +} +interface Ringer { + ring: (times: number) => void; +} +interface StringLiteral { + literal(): "A"; + literals: "A" | "B"; +} + +abstract class Watcher { + abstract watch(e: Event): number; +} + +class Alarm extends Watcher implements Listener, Ringer, StringLiteral { + str: string; + handle = e => { + this.str = e.time; // error + } + superHandle = e => { + this.str = e.time; // error + return e.time; + } + ring(times) { + this.str = times; // error + } + watch(e) { + this.str = e.time; // error + return e.time; + } + literal() { + return "A"; // ok: "A" is assignable to "A" + } + literals = "A"; // ok: "A" is assignable to "A" | "B" +} + +interface A { + p: string; + q(n: string): void; + r: string; + s: string; +} +interface B { + p: number; + q(n: number): void; + r: boolean; + s: string; +} +class C { + r: number; +} +class Multiple extends C implements A, B { + p = undefined; // error, Multiple.p is implicitly any because A.p and B.p exist + q(n) { // error, n is implicitly any because A.q and B.q exist + n.length; + n.toFixed; + } + r = null; // OK, C.r wins over A.r and B.r + s = null; // OK, A.s and B.s match +} +let multiple = new Multiple(); +multiple.r.toFixed; // OK, C.r wins so Multiple.r: number +multiple.r.length; // error, Multiple.r: number +multiple.s.length; // OK, A.s and B.s match. diff --git a/tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping2.ts b/tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping2.ts new file mode 100644 index 00000000000..465d5da931c --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/implementedPropertyContextualTyping2.ts @@ -0,0 +1,23 @@ +interface Long { + length: number; +} +interface Lol { + canhaz: string; +} +interface Ceiling { + location: { [coordinates: string]: [number, number] }; +} +interface Invisible { + invisibles: string[]; +} +class Cat implements Long, Lol, Ceiling, Invisible { + length = undefined; + canhaz = null; + location = {}; + invisibles = []; +} +const lolCat = new Cat(); +lolCat.length = "wat"; +lolCat.canhaz = false; +lolCat.location['ceiling'] = -1; +lolCat.invisibles.push(0);