gpt4 book ai didi

TypeScript:无效返回类型转换为任何类型?

转载 作者:搜寻专家 更新时间:2023-10-30 20:31:16 24 4
gpt4 key购买 nike

我似乎无法理解为什么下面的代码不会引发错误:

var rg: {(): void;}[] = [];
rg.push(function():string {return "";})

我清楚地声明类型应该是返回 void 的函数数组,但是我向那里推送了一个返回 string 的函数,但编译器没有提示.如果我将 rg 的定义更改为

var rg: {():number;}[] = [];

编译器开始报错。

这是一个错误还是 void 返回类型应该如何工作(即如果使用 void 什么都会发生,基本上使其与返回类型相同>)?

最佳答案

这是设计使然(我将很快解释为什么它是好的设计)。规范说(在第 3.6.3 节中,为清楚起见进行了删减):

A type S is assignable to a type T, and T is assignable from S, if one of the following is true...

  • S and T are object types and, for each member M in T, one of the following is true:

    • M is a call, construct or index signature and S contains a call, construct or index signature N where

      • the result type of M is Void, or the result type of N is assignable to that of M.

在这种情况下,我们正在测试 () => string 是否可分配给 () => void。所以 string 必须可以分配给 void(不是),或者 void 必须是 void (它是)。


实际上,这里的规则是您可以丢弃返回值,这与例如C++ 在模板解析中处理 void

function decrementWidgetHeight(w: Widget): number {
// ... returns the new height of the widget
}

function applyToManyWidgets(w: Widget[], change: (x: Widget) => void): void {
// for each widget in the array, apply 'change' to it
}

// Later...
applyToManyWidgets(widgetsToShorten, decrementWidgetHeight); // Should be allowed?

当我们将 change 的类型限制为 (widget) => void 时,我们这样做是为了让您可以传递 decrementWidgetHeight 作为第二个参数,尽管它有一个返回值,但是仍然确保当我们编写 applyToManyWidgets 的主体时,我们不会不小心使用返回值在任何地方更改

请注意 void 仍然不同于 any 因为这是不允许的:

function f() { }
var x = f(); // Disallowed, f() is of type 'void'

关于TypeScript:无效返回类型转换为任何类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761607/

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