为什么 TypeScript 不报告“错误”的函数返回类型

杜伯克夫勒

我很惊讶为什么 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);

TS游乐场

平方公里

TypeScript 不在乎

你只给出一个函数引用setCallback()它可以是你喜欢的任何东西。只要你不调用函数本身,它就被视为 anobject并且TypeScript 不会给你一个 TypeError因为你的函数需要一个object.

如果你调用object,它会变成它各自的类型,TypeScript 会在不匹配的情况下给你一个 TypeError 。

  1. 通过引用传递的变量

在传递引用中,通过直接传递变量的引用/地址作为参数来调用函数。更改函数内部的参数会影响从函数外部传递的变量。在 Javascript 中,对象和数组是通过引用传递的。

  1. 函数 (MDN)

一般来说,函数是一个“子程序”,可以被函数的外部(或递归情况下的内部)代码调用。与程序本身一样,函数由称为函数体的一系列语句组成。值可以传递给函数,函数将返回一个值。

在 JavaScript 中,函数是一等对象,因为它们可以像任何其他对象一样拥有属性和方法。它们与其他对象的区别在于可以调用函数。简而言之,它们是 Function 对象。

示例 1

因为我不能.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);

示例 2

如果您尝试使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 TypeScript 不报告这个打字错误?

为什么我的TypeScript报告联合类型错误?

为什么TypeScript无法检查函数的返回类型

在TypeScript中,为什么我的类型别名返回错误?

为什么TypeScript错误地推断返回类型?

为什么 TypeScript 在推断函数的返回类型时不会自动使用文字类型?

[Typescript] [RxJS]为什么返回可观察的部分类型时没有类型错误?

ESLint不报告TypeScript编译器类型检查错误

为什么函数在TypeScript中扩展Record?

为什么TypeScript无法推断此JSX工厂的返回类型?

为什么要在TypeScript中声明“ any”返回类型?

为什么Typescript函数类型签名包含参数名称

为什么TypeScript无法推断递归函数的类型

为什么Typescript无法推断此函数的参数类型?

TypeScript:为什么函数可以返回值,尽管它的类型不允许?

为什么Typescript不要求我的函数返回某个类型?

为什么 TypeScript 不能推断出这个函数的返回类型?

为什么异步 TypeScript 函数不返回 Promise

为什么下面的 TypeScript 程序不会抛出类型错误?

为什么TypeScript泛型抑制类型错误?

为什么 TypeScript 4 转译器没有看到传递给函数的错误类型?

TypeScript:从函数中返回_.orderBy,要使用什么返回类型?

返回 AsyncFunction 的 Typescript 函数的适当返回类型是什么?

为什么TypeScript类型不能检查React props?

为什么TypeScript接受值作为数据类型?

为什么TypeScript不急于简化愚蠢的联合类型?

为什么我的类型在 React 和 TypeScript 中为 null?

为什么我们在Typescript中需要任何类型?

为什么 Typescript 不让 BehaviorSubject 采用联合类型?