let test: {}; test = 1; test = null; test = false;
function printer (param: string | number) { console.log(param) }
class Dog { eat () {} guardHome () {} } class Cat { eat () {} catchMice () {} } function animalFactory (): Dog | Cat { if (Math.random() * 10 > 5) { return new Dog(); } else { return new Cat(); } } let ani = animalFactory(); ani.guardHome(); // error ani.eat()
根据上面的结论, animalFactory 的返回值应该是Dog类或Cat类的实例均可以,可是却恰恰只有eat方法能调用成功,属于各自单独类的guardHome或 catchMice方法都不能调用成功。javascript
let str; let val: number = (str as string).length; let val2: number = (<string>str).length;
let str; function checkString (str: any): str is string { return str; }
function checkString (param: number | string) { if (typeof param === 'string') { let temp = param; //ok 此处param为string param += '1'; //ok 此处param为 string | number param += '1'; //ok 此处param为 string | number param += 1; // ok 此处string类型能够与数字相加 return param; // 此处param为number } else { // 此处此处至关于 if (typeof param === 'number') param += 1; // ok 此处param为 string | number param += '1'; // error number类型不能与字符串相加 return param // 此处param为number } }
interface testInter { name: string, age: number } let testArr: string[] = ['tate', 'pomelott']; let testObj: testInter = {name: 'tate', age: 26}
先来验证数组:前端
function showKey<K extends keyof T, T> (key: K, obj: Array<string>) { return key; } showKey<number, Array<string>>(1, testArr);
再来验证对象:java
function showKey<K extends keyof T, T> (keyItem: K, obj: T): K { return keyItem; } let val = showKey('name', testObj)
此处有个须要特别注意的点:使用泛型如何表示某个特定key组成的数组:chrome
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] { return items.map(item => obj[item]) }
上例中的 T[K][] 意为K类型的数组,并且须要知足,K为T的keytypescript
真正理解了上面这句话,天然就会明白下面四种写法实际上是等价的:数组
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] { return items.map(item => obj[item]) } function showKey<K extends keyof T, T> (items: K[], obj: T): Array<T[K]> { return items.map(item => obj[item]) } function showKey<K extends keyof T, T> (items: K[], obj: {[K in keyof T]: any}): K[] { return items.map(item => obj[item]) } function showKey<K extends keyof T, T> (items: K[], obj: {[K in keyof T]: any}): Array<K> { return items.map(item => obj[item]) } let obj = showKey(['name'], testObj)
关于TS泛型和高级类型的新发现,持续更新中。。。浏览器