我很惊讶为什么 TypeScript 4.4.3 不会报告回调函数的无效类型?这在返回“非承诺”类型时似乎是合理的,但是当返回 Promise 时,我们似乎必须等待它解决。setCallback
期望一个函数返回,void
但被调用时返回一个函数Promise<void>
表示有一些东西要等待。
const setCallback = (cb: () => void): void => {
cb();
};
const callback = (): Promise<void> => {
return new Promise(resolve => {
setTimeout(() => resolve(), 100);
});
}
setCallback(callback);
你只给出一个函数引用,setCallback()
它可以是你喜欢的任何东西。只要你不调用函数本身,它就被视为 anobject
并且TypeScript 不会给你一个 TypeError因为你的函数需要一个object
.
如果你调用object
,它会变成它各自的类型,TypeScript 会在不匹配的情况下给你一个 TypeError 。
在传递引用中,通过直接传递变量的引用/地址作为参数来调用函数。更改函数内部的参数会影响从函数外部传递的变量。在 Javascript 中,对象和数组是通过引用传递的。
一般来说,函数是一个“子程序”,可以被函数的外部(或递归情况下的内部)代码调用。与程序本身一样,函数由称为函数体的一系列语句组成。值可以传递给函数,函数将返回一个值。
在 JavaScript 中,函数是一等对象,因为它们可以像任何其他对象一样拥有属性和方法。它们与其他对象的区别在于可以调用函数。简而言之,它们是 Function 对象。
因为我不能.then()
在 void 函数上使用,所以我必须创建一个IIFE来实现它async
,即使我期待一个 void 类型的回调它仍然可以工作。
const setCallback = (cb: () => void): void => {
(async () => await cb())().then(() => console.log("Hi"));
};
const callback = (): Promise<number> => {
return new Promise(resolve => {
setTimeout(() => resolve(0), 100);
});
}
setCallback(callback);
如果您尝试使用Promise
返回类型调用它:
“Promise”类型的参数不可分配给“() => void”类型的参数。类型 'Promise' 不匹配签名 '(): void'。
错误是指函数签名不匹配。
const setCallback = (cb: () => void): void => {
(async () => await cb())().then(() => console.log("Hi"));
};
const callback = (): Promise<number> => {
return new Promise(resolve => {
setTimeout(() => resolve(0), 100);
});
}
setCallback(callback());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句