打字错误首先callback打字(noImplicitAny,strictNullChecks)
我想在一个项目中使用带有noImplicitAny
和strictNullChecks
声明一个带有错误优先callback的函数。
有没有办法来声明一个interface
或type
,允许两个不同的签名和调用时工作?
最简单最直接的方法就是这样宣布
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个参数调用。
然而,这两种模式都意味着err
和result
都可能是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)
将导致错误。
然而; 当我然后使用这个example
function;
example((err, result) => { ... });
err
和result
都是隐含的。 有没有什么办法来声明允许(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是可以自由的忽略处理错误,如果需要的话。