Typescript 是否从函数类型中省略返回类型?

Typescript 是否从函数类型中省略返回类型?,typescript,generics,typescript-typings,typescript-generics,Typescript,Generics,Typescript Typings,Typescript Generics,是否可以从具有相同参数和泛型但没有返回类型的现有typescript函数创建新函数类型 示例: 我试图从ReturnSame函数创建类型ReturnNothing,而不必手动定义它 type ReturnSame=(a:T)=>T 类型ReturnNothing=(a:T)=>void 尝试: 函数返回相同(a:T):T{ 返回a; } //尝试1:不工作。泛型不符合新类型。 常量returnNothing1=(…参数:参数)=>{ 控制台日志(params); }; //尝试2:不工作。返回

是否可以从具有相同参数和泛型但没有返回类型的现有typescript函数创建新函数类型

示例:

我试图从
ReturnSame
函数创建类型
ReturnNothing
,而不必手动定义它

type ReturnSame=(a:T)=>T
类型ReturnNothing=(a:T)=>void
尝试:

函数返回相同(a:T):T{
返回a;
}
//尝试1:不工作。泛型不符合新类型。
常量returnNothing1=(…参数:参数)=>{
控制台日志(params);
};
//尝试2:不工作。返回类型是强制的。
const returnNothing2:typeof returnSame=(…参数)=>{
控制台日志(params);
};
//尝试3:不工作。OmitReturn是一个组合的Typescript实用程序。
const returnnothing 3:ommitreturn=(…参数)=>{
控制台日志(params);
};
//用法
常量相同=返回相同(“a”);
常量nothing1=返回nothing1(“b”);

目前无法完全在类型级别自动执行此操作。含义:您不能采用类似于
ReturnSame
的泛型函数类型,并以一种不会立即为其类型参数(如
t
)插入
unknown
(或其泛型约束是什么)的方式获取其参数。这样做可能需要TypeScript目前不直接支持的更高级类型(有关功能请求,请参阅)

您可以完全放弃,将
returnNothing()
作为一个通用函数手动写出,但您不想这样做

如果可以通过将
returnSame()
传递给函数来降低到值级别,则可以利用TypeScript 3.4中介绍的:

function makeNothingReturner<A extends any[]>(fn: (...a: A) => any): (...a: A) => void {
  return (...a) => void fn(...a);
}

const returnNothing = makeNothingReturner(returnSame);
因此,您可以根据需要使用它,方法是使用指定的类型参数调用:

const nothing = returnNothing<"b">("b"); // works
const nothing=returnNothing(“b”);//作品

目前没有办法完全在类型级别自动执行此操作。含义:您不能采用类似于
ReturnSame
的泛型函数类型,并以一种不会立即为其类型参数(如
t
)插入
unknown
(或其泛型约束是什么)的方式获取其参数。这样做可能需要TypeScript目前不直接支持的更高级类型(有关功能请求,请参阅)

您可以完全放弃,将
returnNothing()
作为一个通用函数手动写出,但您不想这样做

如果可以通过将
returnSame()
传递给函数来降低到值级别,则可以利用TypeScript 3.4中介绍的:

function makeNothingReturner<A extends any[]>(fn: (...a: A) => any): (...a: A) => void {
  return (...a) => void fn(...a);
}

const returnNothing = makeNothingReturner(returnSame);
因此,您可以根据需要使用它,方法是使用指定的类型参数调用:

const nothing = returnNothing<"b">("b"); // works
const nothing=returnNothing(“b”);//作品

除了@jcalz所说的:它在类型级别上部分是可能的。()

typegenfn=(a:AS)=>T
Fn型=
G扩展了GenFN
? GenFN
:从不
类型ThisWorks=VoidFN
键入ThisDoesNotWork=VoidFN 2>
但这将要求您在任何地方使用helper
GenFN
,而不是像
(a:AS)=>2这样的直接定义,从而使
VoidFN
与部分(当前和未来)代码库和第三方库不兼容


另一个风险:如果您的代码库变大并且类型定义嵌套得很深,我不确定TS是否可能“忘记”/“放弃”特定类型由于内部优化而扩展的信息
GenFN

除了@jcalz所说的:在类型级别上部分是可能的。()

typegenfn=(a:AS)=>T
Fn型=
G扩展了GenFN
? GenFN
:从不
类型ThisWorks=VoidFN
键入ThisDoesNotWork=VoidFN 2>
但这将要求您在任何地方使用helper
GenFN
,而不是像
(a:AS)=>2这样的直接定义,从而使
VoidFN
与部分(当前和未来)代码库和第三方库不兼容

另一个风险:如果您的代码库变大并且类型定义嵌套得很深,我不确定TS是否会由于内部优化而“忘记”/“放弃”特定类型扩展的信息
GenFN