Typescript 是否可以将typeof与泛型函数一起使用?

Typescript 是否可以将typeof与泛型函数一起使用?,typescript,typescript-generics,Typescript,Typescript Generics,是否可以为泛型函数的返回类型设置别名?像这样 export function ok<TValue>(value: TValue) { return { type: 'Ok', value, } as const; } export type Ok<TValue> = ReturnType<typeof ok<TValue>>; 导出功能正常(值:TValue){ 返回{ 键入:“Ok”, 价值 }作为常量; } 导出类型

是否可以为泛型函数的返回类型设置别名?像这样

export function ok<TValue>(value: TValue) {
  return {
    type: 'Ok',
    value,
  } as const;
}

export type Ok<TValue> = ReturnType<typeof ok<TValue>>;
导出功能正常(值:TValue){
返回{
键入:“Ok”,
价值
}作为常量;
}
导出类型Ok=返回类型;

这是一个有趣的难题。我相信答案是(有点)是的,但它相当混乱

基本问题是<代码> OK 将考虑<代码>值<代码> be >代码>未知<代码>。没有什么好方法可以让
类型
声明重写
未知数
,所以让我们定义一些类型来为我们做这件事

//首先,它将访问类型中的所有属性(递归)
类型替换未知儿童=
{[K in keyof TIn]:ReplaceUnknown};
//第二,用特定类型替换任何“未知”的类型
类型ReplaceUnknown=未知扩展T?TWith:T;
然后我们需要一个
ReturnType
的变体来为我们实现这一点。我们必须显式地提供我们想要绑定的
T
(名称需要在范围内),因此语法与您可能期望的略有不同


类型GenericReturn=
T扩展(…args:any[])=>推断R?
替换未知儿童:
任何
把它们放在一起

类型替换未知儿童=
{[K in keyof TIn]:ReplaceUnknown};
//第二,用特定类型替换任何“未知”的类型
类型ReplaceUnknown=未知扩展T?TWith:T;
类型GenericReturn=
T扩展(…args:any[])=>推断R?
替换未知儿童:
任何
导出功能正常(值:TValue){
返回{
键入:“Ok”,
价值
}作为常量;
}
导出类型Ok=GenericReturn;
给你这个


最大的限制是如果函数的返回类型中有多个泛型类型。使用vararidic泛型类型(TypeScript4.0中提供)可能是可行的,但我必须使用它们来确保这一点。

我永远不会想到这一点。我猜如果
ok
有更多的参数,除非它们是泛型的并且是返回的一部分,否则就没有关系了?是的,返回的每种类型都需要处理。如果它们只是参数,那就没关系了。