在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 關(guān)于typescript 使用類類型語法 new()?

關(guān)于typescript 使用類類型語法 new()?

在使用ts時,我看到有這樣的語法,但是沒明白這樣定義的好處以及為什么這樣定義?

function create<T>(c: {new(): T; }): T {
    return new c();
}

class BeeKeeper {
    hasMask: boolean;
}

class ZooKeeper {
    nametag: string;
}

class Animal {
    numLegs: number;
}

class Bee extends Animal {
    keeper: BeeKeeper;
}

class Lion extends Animal {
    keeper: ZooKeeper;
}

function createInstance<A extends Animal>(c: new () => A): A {
    return new c();
}

createInstance(Lion).keeper.nametag;  // typechecks!
createInstance(Bee).keeper.hasMask;   // typechecks!
回答
編輯回答
誮惜顏

如果不使用 new(): T 你把這個功能寫出來試試。

create 函數(shù)的參數(shù)是一個 Class,返回值是這個 Class 的實例。

c: T 的意思是,c 的類型是 T,但這個函數(shù)的目的不是要求 c 的類型是 T,而是要求 c 就是 T。

試比較一下:

let num = new Number(1);
fn(Number)
fn(num)
2017年10月9日 13:33
編輯回答
拽很帥

這里使用了泛型,能夠讓我們減少錯誤,寫一個例子你就明白了:
`function showData(data){

return data;

}
showData('abc').length;
showData(12).length;//這樣寫js不報錯但是是undefined
showData({ name: 'leo' }).length;
showData([12, 5, 8]).length;`
我們是很討厭代碼沒有語法錯誤但是最終結(jié)果不對的,
用泛型就可以讓編寫階段直接報語法錯誤,而不是語法正確,結(jié)果錯誤,代碼如下:

function showData<T>(data:T){
    return data;
}
console.log(showData<string>('abc').length);
console.log(showData<number>(12).length);
console.log(showData({ name: 'leo' }).length);
console.log(showData([12, 5, 8]).length);

報語法錯誤,而不會被編譯成js,這樣就可以扼殺錯誤在搖籃之中

2017年3月7日 00:19