打字错误首先callback打字(noImplicitAny,strictNullChecks)

我想在一个项目中使用带有noImplicitAnystrictNullChecks声明一个带有错误优先callback的函数。

有没有办法来声明一个interfacetype ,允许两个不同的签名和调用时工作?

最简单最直接的方法就是这样宣布

 function example(callback: (err?: Error, result?: {data: any}) => void) { callback(undefined, {data: "hello"}); } 

然而,这允许我调用callback() (没有参数),这不是我们想要做的事情,因为callback应该总是以错误或者结果来调用。

 function example(callback: (err: Error | undefined, result: {data: any} | undefined) => void) { callback(undefined, {data: "hello"}); } 

这不允许example() 。 callback必须用2个参数调用。

然而,这两种模式都意味着errresult都可能是undefined 。 这是不完美的,因为以下将导致错误。

 example((err, result) => { if(err) { console.error(err); return; } console.log(result.data); }); 

由于result 可能undefined ,我们不能认为它有属性data 。 为了解决这个问题,我必须声明第二个参数是调用时的一些东西, example((err, result: {data: any}) => void) ,或者包含任何与if(result)


我想声明callback将总是被调用
callback(undefined, { data: "Hello" }) callback(Error, undefined) 。 这两个参数永远不会被定义。

我发现宣布的工作方式是

 interface ICallback<r> { (err: undefined, result: r): void; (err: Error, result: undefined): void; }; function example(callback: ICallback<{data: any}>) { callback(undefined, {data: "hello"}); } 

这似乎是作为,内部的example ,调用callback(new Error(), {data: "error"})callback(undefined, undefined)将导致错误。

然而; 当我然后使用这个examplefunction;

 example((err, result) => { ... }); 

errresult都是隐含的。 有没有什么办法来声明允许(undefined, ISomething)(ISomethingElse, undefined)签名的callback函数,这意味着如果parameter1是未定义的,那么我们可以期望定义parameter2。

然而,允许我调用example(()=> void),这不是我想要的东西,因为我们应该处理至less这个错误。

这将永远是这样的。 callback可以自由地忽略任何参数。

这是因为TypeScript的function兼容性: https : //basarat.gitbooks.io/typescript/content/docs/types/type-compatibility.html#number-of-arguments

更多

在某种程度上,这与您可以自由地忽略捕捉exception相似。 所以callback是可以自由的忽略处理错误,如果需要的话。