2016-10-19 23 views
1

TypeScript具有方便的屬性,即文字字符串可以是泛型函數的類型參數。因此,你可以做TypeScript文字類型參數不傳播返回

let a:HTMLAnchorElement = document.createElement("a"); 

和編譯器知道它是正確的(因爲超載createElement(tagName:"a"):HTMLAnchorElement的)。

我曾希望這將是非常聰明,它也明白以下幾點:

function createEl<T extends string>(type:T) { 
    let el = document.createElement(type); 
    // ...stuff... 
    return el; 
} 
let a:HTMLAnchorElement = createEl("a"); 

但不幸的是,它並沒有(提供了一個「不可轉讓」的錯誤)。有什麼我錯過了,可以使它如此,或者我應該找到另一種方法?

回答

0

會發生什麼事是,createElementthe last signature用於:

createElement(tagName: string): HTMLElement; 

這可能是同樣的事情:

function fn(s: "one" | "two") { } 
let s = "two"; 
fn(s); // Error: Argument of type 'string' is not assignable to parameter of type '"one" | "two"' 

對於那些那裏的an open issue
在這種情況下打開並可能感興趣的另一個問題是Always use literal types

現在,你可以這樣做:

function createEl(type: string) { 
    let el = document.createElement(type); 
    // ...stuff... 
    return el; 
} 

let d = createEl("div") as HTMLDivElement; 
let a = createEl("a") as HTMLAnchorElement; 

這是不一樣優雅,但它的工作原理。