Typescript高级类型与泛型难点详解
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()
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);
再来验证对象:
function showKey<K extends keyof T, T> (keyItem: K, obj: T): K { return keyItem; } let val = showKey('name', testObj)
此处有个需要特别注意的点:使用泛型如何表示某个特定key组成的数组:
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] { return items.map(item => obj[item]) }
上例中的 T[K][] 意为T类型的K组成的数组,而且需要满足,K为T的key
真正理解了上面这句话,自然就会明白下面四种写法其实是等价的:
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总结,未完待续中。。。