TypeScript/tests/cases/conformance/types/typeAliases/genericTypeAliases.ts
2017-08-20 02:54:26 +08:00

73 lines
1.2 KiB
TypeScript

type Tree<T> = T | { left: Tree<T>, right: Tree<T> };
var tree: Tree<number> = {
left: {
left: 0,
right: {
left: 1,
right: 2
},
},
right: 3
};
type Lazy<T> = T | (() => T);
var ls: Lazy<string>;
ls = "eager";
ls = () => "lazy";
type Foo<T> = T | { x: Foo<T> };
type Bar<U> = U | { x: Bar<U> };
// Deeply instantiated generics
var x: Foo<string>;
var y: Bar<string>;
x = y;
y = x;
x = "string";
x = { x: "hello" };
x = { x: { x: "world" } };
var z: Foo<number>;
z = 42;
z = { x: 42 };
z = { x: { x: 42 } };
type Strange<T> = string; // Type parameter not used
var s: Strange<number>;
s = "hello";
interface AB<A, B> {
a: A;
b: B;
}
type Pair<T> = AB<T, T>;
interface TaggedPair<T> extends Pair<T> {
tag: string;
}
var p: TaggedPair<number>;
p.a = 1;
p.b = 2;
p.tag = "test";
function f<A>() {
type Foo<T> = T | { x: Foo<T> };
var x: Foo<A[]>;
return x;
}
function g<B>() {
type Bar<U> = U | { x: Bar<U> };
var x: Bar<B[]>;
return x;
}
// Deeply instantiated generics
var a = f<string>();
var b = g<string>();
a = b;