gpt4 book ai didi

node.js - Typescript 错误优先回调类型(noImplicitAny、strictNullChecks)

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:10 26 4
gpt4 key购买 nike

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

有没有一种方法可以声明一个interfacetype 来允许两种不同的签名并在调用时起作用?

最简单直接的方法就是这样声明

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

但是,这允许我在 example 中调用 callback()(不带参数),这不是我们想要做的事情,因为回调应该始终被调用错误或结果。

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

这不允许 example()。必须使用 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(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 函数时;

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

errresult 都是隐式的 any。有什么方法可以声明允许 (undefined, ISomething)(ISomethingElse, undefined) 签名的回调函数,这意味着我们可以期望 parameter2 被定义如果 parameter1 未定义?

最佳答案

however, allows me to call example(() => void) which is not really something I want as we should handle atleast the error.

永远都是这样。回调可以自由地忽略任何参数。

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

更多

在某种程度上,这类似于您可以随意忽略捕获异常的方式。因此,如果需要,回调可以随意忽略对错误的处理。

关于node.js - Typescript 错误优先回调类型(noImplicitAny、strictNullChecks),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42603810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com