Javascript 如何定义函数';s参数类型依赖于Typescript中的字符串参数?

Javascript 如何定义函数';s参数类型依赖于Typescript中的字符串参数?,javascript,typescript,generics,typescript-generics,Javascript,Typescript,Generics,Typescript Generics,我有一个Javascript代码中的现有函数,我正试图为它编写一个类型定义文件,以便进行严格的类型检查。它是这样使用的: createElement("a", {href: "www.example.com"}); 该项目使用自定义html元素。第一个参数是带有标记的字符串,正如您所看到的,第二个参数的类型取决于字符串标记,因为它应该是与标记所期望的一致的属性到值映射 我正在尝试类似的东西,但它不起作用 type Tag<T> = string; const stringTag:

我有一个Javascript代码中的现有函数,我正试图为它编写一个类型定义文件,以便进行严格的类型检查。它是这样使用的:

createElement("a", {href: "www.example.com"});
该项目使用自定义html元素。第一个参数是带有标记的字符串,正如您所看到的,第二个参数的类型取决于字符串标记,因为它应该是与标记所期望的一致的属性到值映射

我正在尝试类似的东西,但它不起作用

type Tag<T> = string;
const stringTag: Tag<string> = "IamString";
const numberTag: Tag<number> = "IamNumber";

function doStuff<T>(
    tag: Tag<T>,
    content: T
): void {
    console.log(tag, content);
}

doStuff(stringTag, "IshouldBeString");
doStuff(numberTag, "IshouldBeNumber"); // Should be WRONG
doStuff(numberTag, 10); // CORRECT
类型标记=字符串;
const stringTag:Tag=“IamString”;
const numberTag:Tag=“IamNumber”;
函数doStuff(
标签:标签,
内容:T
):无效{
console.log(标签、内容);
}
doStuff(stringTag,“IshouldBeString”);
doStuff(数字标记,“IshouldBeNumber”);//应该是错的
多斯塔夫(数字代号,10);//对的
它会抱怨未使用的“T”参数,而不会抱怨numberTag的字符串参数错误。如果我使用一个现有的泛型类型,比如
Array
,而不是
Tag
,doStuff会正确地约束第二个参数

我试图维护现有的API(字符串类型的标签),但可以考虑更改它。


谢谢。

我能想到的唯一方法是使用“字符串文字类型”和条件类型,因此您必须手动拼写所有这些类型定义

type TagType = "a" | "button";
type Tag<T extends TagType> =
    T extends "a" ? AType :
    T extends "button" ? ButtonType : never;

interface AType {
    href: string;
}

interface ButtonType {
    onClick: () => void
}

function doStuff<T extends TagType>(tag: T, content: Tag<T>) {
    console.log(tag, content)
}

doStuff("a", { href: "" }); // CORRECT
doStuff("button", { href: "" }); // WRONG
doStuff("button", { onClick: () => {} }); // CORRECT
type TagType=“a”|“按钮”;
类型标签=
T扩展“a”?AType:
T扩展“按钮”?纽扣类型:从不;
接口类型{
href:string;
}
接口按钮类型{
onClick:()=>void
}
函数doStuff(标记:T,内容:标记){
console.log(标记、内容)
}
doStuff(“a”,{href:});//对的
doStuff(“按钮”{href:});//错
doStuff(“按钮”,{onClick:()=>{}});//对的