gpt4 book ai didi

typescript :如何为不应返回任何内容的回调定义类型?

转载 作者:行者123 更新时间:2023-12-04 13:36:09 27 4
gpt4 key购买 nike

我的意思是它应该返回 undefined或者根本没有返回。典型的安全回调。

试用 1:

declare const fn1: (cb: () => void) => void;
fn1(() => '123'); // no error

哎呀。它没有成功。 string适用于 void .好的...

试用 2:
declare const fn2: (cb: () => unknown) => void;
fn2(() => '123'); // no error

哎呀。相同。哎呀。

试用 3:
declare const fn3: (cb: () => undefined) => void;
fn3(() => '123'); // error: Type 'string' is not assignable to type 'undefined'

好的!好吧,随它去吧:
fn3(() => undefined); // okay
fn3(() => {}); // error: Type 'void' is not assignable to type 'undefined'

嗯。这不是我要找的。

好吧,这个疯狂的想法是怎么回事?试用 4:
declare const fn4: (cb: () => void | undefined) => void;
fn4(() => undefined); // okay
fn4(() => { }); // okay
fn4(() => '123'); // error: Type 'string' is not assignable to type 'undefined'

哇。这就是我想要的。

但它看起来像一个肮脏的黑客。为什么在地球上 void不提示 string ,但是 void | undefined可以?这是一个错误吗?

我可以依赖这种行为吗?它不会在 future 的 TS 版本中修复吗?有没有更好的方法来完成同样的事情?

最佳答案

更新 2

不应该有任何参数甚至是可选的并且不应该返回任何内容的回调应该这样定义:

type callback = (...a: void[]) => void | undefined;

const func = (a: callback) => {
a();
};

const test1 = func(() => { }); // works
const test2 = func((a?: string) => { }); // fails
const test2 = func(() => '5'); // fails

更新

在评论中讨论后发现,目标是获得一个回调,而不是忽略返回,但保证它不会返回任何其他内容,并且可以将其传递给其他根据返回值改变行为的函数。

在这种情况下,我建议添加一个真正忽略任何返回值的小辅助函数。

const shutUp = <T extends (...args: any) => void>(func: T): ((...args: Parameters<T>) => void) => (...args: any[]) => {
func(...args);
};

const shutUpNoArgs = <T extends () => void>(func: T): ((...args: never) => void) => () => {
func();
};

const test = shutUp((a: string) => 5);

const r1 = test('5'); // works, r1 is void.
const r2 = test(5); // doesn't work.

_.forEach(data, shutUp(callback));


原件

你不应该这么严格,也不要太担心。
void意味着我们不关心返回,如果我们不依赖它,我们应该吗?

这与说我们不接受函数是一样的,因为它不需要我们的 a争论尽管它可以处理这个案子。

declare const fn1: (cb: (a: string) => void) => void;

fn1(() => {
}); // no error even we don't have `a` in our callback.

文档: https://www.typescriptlang.org/docs/handbook/basic-types.html#void

void is a little like the opposite of any: the absence of having any type at all.



因此,它的行为不会改变,您可以将它与 undefined 联合使用。 .

关于 typescript :如何为不应返回任何内容的回调定义类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61914121/

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