2016-10-19 6 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; 

これは同じものであるかもしれないための:an open issueがありますそのため

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


開かれており、この場合には別の問題は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; 

が、それは動作します:

今のところ、あなたはこれを行うことができます。

関連する問題