Adding tests
This commit is contained in:
parent
dc629d5a54
commit
a0842aaf04
2 changed files with 95 additions and 0 deletions
|
@ -0,0 +1,72 @@
|
|||
// Repro from #2264
|
||||
|
||||
interface Y { 'i am a very certain type': Y }
|
||||
var y: Y = <Y>undefined;
|
||||
function destructure<a, r>(
|
||||
something: a | Y,
|
||||
haveValue: (value: a) => r,
|
||||
haveY: (value: Y) => r
|
||||
): r {
|
||||
return something === y ? haveY(y) : haveValue(<a>something);
|
||||
}
|
||||
|
||||
var value = Math.random() > 0.5 ? 'hey!' : <Y>undefined;
|
||||
|
||||
var result = destructure(value, text => 'string', y => 'other one'); // text: string, y: Y
|
||||
|
||||
// Repro from #4212
|
||||
|
||||
function isVoid<a>(value: void | a): value is void {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function isNonVoid<a>(value: void | a) : value is a {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function foo1<a>(value: void|a): void {
|
||||
if (isVoid(value)) {
|
||||
value; // value is void
|
||||
} else {
|
||||
value; // value is a
|
||||
}
|
||||
}
|
||||
|
||||
function baz1<a>(value: void|a): void {
|
||||
if (isNonVoid(value)) {
|
||||
value; // value is a
|
||||
} else {
|
||||
value; // value is void
|
||||
}
|
||||
}
|
||||
|
||||
// Repro from #5417
|
||||
|
||||
type Maybe<T> = T | void;
|
||||
|
||||
function get<U>(x: U | void): U {
|
||||
return null; // just an example
|
||||
}
|
||||
|
||||
let foo: Maybe<string>;
|
||||
get(foo).toUpperCase(); // Ok
|
||||
|
||||
// Repro from #5456
|
||||
|
||||
interface Man {
|
||||
walks: boolean;
|
||||
}
|
||||
|
||||
interface Bear {
|
||||
roars: boolean;
|
||||
}
|
||||
|
||||
interface Pig {
|
||||
oinks: boolean;
|
||||
}
|
||||
|
||||
declare function pigify<T>(y: T & Bear): T & Pig;
|
||||
declare var mbp: Man & Bear;
|
||||
|
||||
pigify(mbp).oinks; // OK, mbp is treated as Pig
|
||||
pigify(mbp).walks; // Ok, mbp is treated as Man
|
|
@ -0,0 +1,23 @@
|
|||
declare function f1<T>(x: T | string): T;
|
||||
|
||||
var a1: string;
|
||||
var b1: string | string[];
|
||||
var c1: string[] | string;
|
||||
var d1: string | { name: string };
|
||||
var e1: number | string | boolean;
|
||||
f1(a1); // string
|
||||
f1(b1); // string[]
|
||||
f1(c1); // string[]
|
||||
f1(d1); // { name: string }
|
||||
f1(e1); // number | boolean
|
||||
|
||||
declare function f2<T>(x: T & { name: string }): T;
|
||||
|
||||
var a2: string & { name: string };
|
||||
var b2: { name: string } & string[];
|
||||
var c2: string & { name: string } & number;
|
||||
var d2: string & { name: string } & number & { name: string };
|
||||
f2(a2); // string
|
||||
f2(b2); // string[]
|
||||
f2(c2); // string & number
|
||||
f2(d2); // string & number
|
Loading…
Reference in a new issue