Javascript Typescript空回调函数

Javascript Typescript空回调函数,javascript,typescript,Javascript,Typescript,在我的angular项目中,我有一个方法,它接受两个回调函数,一个用于成功,一个用于失败,目前看起来像: somefunction(function(token) { console.log('Got token: ' + token); }, function(error) { console.log('Failed to get token', error); }); 假设我想保留错误处理,但我对成功回调不感兴趣,那么仍然处理错误回调的正确方法是什么? 我是否应该创建一

在我的angular项目中,我有一个方法,它接受两个回调函数,一个用于成功,一个用于失败,目前看起来像:

somefunction(function(token) {
    console.log('Got token: ' + token);
  }, function(error) {
    console.log('Failed to get token', error);
});
假设我想保留错误处理,但我对成功回调不感兴趣,那么仍然处理错误回调的正确方法是什么? 我是否应该创建一个空的成功方法,如:

somefunction(function(token) {
  }, function(error) {
    console.log('Failed to get token', error);
});
我应该把null作为第一个参数吗

somefunction(null, function(error) {
    console.log('Failed to get token', error);
});
我不确定使用null是否有任何危险,我应该只添加一个空函数(看起来是多余的)\


编辑:该函数来自库,我不想接触库。

我将尝试对我的评论进行更深入的解释。你正在做的是一个老式的JavaScript编码类型的编码TypeScript的发明是为了防止。在JavaScript中,有两种类型的“空”值,它们相似但不是相同的空值和未定义值。有一段时间,在TypeScript中,默认情况下所有值都是非nulluble的,这意味着与JavaScript不同,如果您试图在函数中输入null或undefined,则会出现编译器错误。如果你的somefunction看起来像这样

function someFunction(success: (token: string) => void, error: (error:string) => void) {

}
somefunction(null,(e)=>{})
这样的调用根本不会编译,因为默认情况下,一切都不可为null。您必须给它一个空回调,比如
somefunction(()=>{},()=>{})
您可以看到您不需要事件参数,因为任何无paraatreless函数都可以强制转换为参数函数。 如果某个函数的创建者在类型脚本中允许“null”,他会这样定义

function someFunction(success?: (token: string) => void, error?: (error:string) => void) {

}
火车在哪里?是一种较短的书写方式()=>void |未定义。现在您可以使用

someFunction(未定义,()=>{})但是调用
someFunction(null,()=>{})将产生错误,因为null不等于(==)未定义。这是允许对TypeScript中的函数进行空调用的最常见方法。如果你真的想要一个空值,你可以这样定义一些函数

function someFunction(success: ((token: string) => void) | null, error: ((error:string) => void) | null) {

    }
这在大多数人使用的typescript和way 2中是非常罕见的。
但是,由于您询问了“最佳实践”,我可以看到您正在做的是一些异步工作流,现代JavaScript和typescript倾向于更倾向于承诺和角度观察(两者并不相互排斥,可以很好地协同工作)

如果您更喜欢使用ES6方式,您可以将此函数包装成承诺。 这将允许您在此功能上使用功能
,然后
catch

let myPromise = new Promise((resolve, reject) => {
    somefunction((item) => { resolve(item) }, (error) => { reject(error) });
   // or even somefunction(resolve, reject);
});
一种简单的方法是创建一个新的
Promise
,并将
resolve
reject
作为参数传递给函数

let myPromise = new Promise((resolve, reject) => {
    somefunction((item) => { resolve(item) }, (error) => { reject(error) });
   // or even somefunction(resolve, reject);
});
然后,您可以将此承诺用作任何其他承诺。就你而言

myPromise.catch((error) => {
    console.error(error);
});
这个函数用于获取您正在尝试执行的操作,但是您可以将其封装到一个函数中,并在需要使用库函数的任何地方使用它

function toPromise(fnc) {
    return new Promise((resolve, reject)  => fnc(resolve, reject));
}

toPromise(somefunction).catch((error) => {
   //handle the error
});

这里我只使用了arrow函数,但如果您愿意,可以使用普通回调函数。

这实际上是一个偏好和一致性的问题。我更喜欢无操作函数
()=>{}
()=>0
,因为这样您就尊重了方法签名(即,在需要函数时传入函数)。传入null需要检查someFunction中的null,这可能会导致不确定哪些函数的参数是null检查的,哪些不是。这是typescript而不是JavaScript,所以这不应该是一个问题。如果方法签名支持null,则使用null(大多数人通常不期望未定义)。这就是为什么您首先要使用Typescript。如果可以,您的函数应该返回一个承诺,然后您可以对其使用
catch
函数来只担心错误。将错误回调设为第一个参数,并将第二个参数(成功)设为可选参数。这样代码就更干净了。@crownlessking它是一个库中的方法,我不想碰库