Generics TypeScript文字类型参数不存在';不要传播返回

Generics TypeScript文字类型参数不存在';不要传播返回,generics,typescript,type-systems,Generics,Typescript,Type Systems,TypeScript具有一个方便的属性,即文字字符串可以是泛型函数的类型参数。因此,你可以这样做 let a:HTMLAnchorElement = document.createElement("a"); 编译器知道它是正确的(因为重载createElement(标记名:“a”):htmlanchoreElement) 我曾希望它会如此聪明,以至于它也明白以下几点: function createEl<T extends string>(type:T) { let el

TypeScript具有一个方便的属性,即文字字符串可以是泛型函数的类型参数。因此,你可以这样做

let a:HTMLAnchorElement = document.createElement("a");
编译器知道它是正确的(因为重载
createElement(标记名:“a”):htmlanchoreElement

我曾希望它会如此聪明,以至于它也明白以下几点:

function createEl<T extends string>(type:T) {
    let el = document.createElement(type);
    // ...stuff...
    return el;
}
let a:HTMLAnchorElement = createEl("a");
函数createEl(类型:T){
设el=document.createElement(类型);
//…东西。。。
返回el;
}
设a:htmlanchoreElement=createEl(“a”);
但不幸的是,它没有(给出了一个“不可分配”的错误)。是否有我遗漏的东西可以让它成为现实,或者我应该找到另一种方法吗?

发生的事情是使用
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"'
对于这一点,我们有很多建议。
另一个在本案中可能感兴趣的问题是

现在,您可以这样做:

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

let d = createEl("div") as HTMLDivElement;
let a = createEl("a") as HTMLAnchorElement;
虽然不那么优雅,但很管用