2016-10-19 11 views
1

ТипScript имеет удобное свойство, что строка-литерал может быть параметром типа для общей функции. Таким образом, вы можете сделатьПараметр типа литерала 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

Что происходит, что the last signature из createElement используется:

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; 

Что не так элегантно, но он работает.