如何向TypeScript编译器提示两个泛型值必须相同?

如何向TypeScript编译器提示两个泛型值必须相同?,typescript,typescript-types,Typescript,Typescript Types,我有一个简化的函数,它接受一个字符串文本和一个返回{type:[mystringliteral]}的回调 函数myFunc(类型:T,回调:()=>{type:T}):ReturnType{ 返回{type}; } 除非我在调用时特别设置了T,T被推断为string而不是文本,并且type属性上没有类型强制 //成功引发编译错误 常量x=myFunc('abc',()=>({type:'def'})); //不会引发错误 常量y=myFunc('abc',()=>({type:'def'}))

我有一个简化的函数,它接受一个字符串文本和一个返回
{type:[mystringliteral]}
的回调

函数myFunc(类型:T,回调:()=>{type:T}):ReturnType{
返回{type};
}
除非我在调用时特别设置了
T
T
被推断为
string
而不是文本,并且
type
属性上没有类型强制

//成功引发编译错误
常量x=myFunc('abc',()=>({type:'def'}));
//不会引发错误
常量y=myFunc('abc',()=>({type:'def'}));
我正在为第三方npm包编写一个声明文件,所以我不能调用任何聪明的函数来提示编译器发生了什么


我猜我要问的问题在当前的TypeScript规范中是完全不可能的(如果我们能做一些类似于
的事情就好了),但我想我会问的。

这里有两个问题。第一个是让编译器推断字符串文字类型。为此,我们需要将
string
约束添加到
T
。这将提示编译器我们需要文本类型

然而,这还不够。只需将
T extends string
添加到签名中,编译器就会推断出
'abc'|'def'
的并集,并且仍然不会产生错误。为了避免这种情况,我们必须让编译器知道,
T
的第二次出现不应用于推理。虽然有人建议为此添加语法,但尚未实施。但是,我们可以使用jcalz建议的解决方法来获得所需的效果:

function myFunc<T extends string>(type: T, callback: () => { type: NoInfer<T> }): ReturnType<typeof callback> {
    return { type };
}
type NoInfer<T> = [T][T extends any ? 0 : never];

// raises an error
const y = myFunc('abc', () => ({ type: 'def' }));
函数myFunc(类型:T,回调:()=>{type:NoInfer}):ReturnType{
返回{type};
}
类型NoInfer=[T][T扩展任何?0:never];
//引起错误
常量y=myFunc('abc',()=>({type:'def'}));