打字稿重载箭头功能不起作用

2023-12-04

(我正在使用严格的空检查)

我有以下带有重载类型的箭头函数:

    type INumberConverter = {
      (value: number): number;
      (value: null): null;
    };
    const decimalToPercent: INumberConverter = (value: number | null): number | null => {
      if (!value) {
        return null;
      }
      return value * 100;
    };

据我从其他问题的理解(在对类方法使用粗箭头语法时可以使用 TypeScript 重载吗?)这应该是有效的。尽管如此,我还是收到以下错误:

TS2322: Type '(value: number | null) => number | null' is not assignable to type 'INumberConverter'.   Type 'number | null' is not assignable to type 'number'.     Type 'null' is not assignable to type 'number'

如果我定期编写这个函数(使用function关键词):

    function decimalToPercent(value: null): null;
    function decimalToPercent(value: number): number;
    function decimalToPercent(value: number | null): number | null {
      if (!value) {
        return null;
      }
      return value * 100;
    }

它可以正常工作。

我需要使用箭头功能所以this不会改变,我需要这个重载,以便打字稿知道decimalToPercent(1)不能为空。

为什么它不像我那样工作,我该如何修复它?


重载签名和实现签名之间的兼容性规则比分配规则宽松得多。

在这种情况下,您尝试分配一个可能返回的函数null具有禁止返回 null ((value: number): number;)。编译器肯定会发现这很麻烦。对于重载,由于签名和实现都是作为一个单元编写的,因此编译器假设“您知道自己在做什么”(无论正确与否)。

您可以通过多种方式解决这个问题:

您可以使用类型断言,尽管您将失去大多数实现、签名兼容性的类型检查:

type INumberConverter = {
  (value: number): number;
  (value: null): null;
};
const decimalToPercent = ((value: number | null): number | null => {
  if (!value) {
    return null;
  }
  return value * 100;
}) as INumberConverter;

您也可以使用常规的function并捕获this和旧的一样ES5天,尽管这个解决方案意味着复制大量的函数签名:

type INumberConverter = {
  (value: number): number;
  (value: null): null;
};

class X {
    decimalToPercent: INumberConverter;
    multiper = 100;
    constructor() {
        let self = this;
        function decimalToPercent(value: number): number;
        function decimalToPercent(value: null): null;
        function decimalToPercent(value: number | null): number | null {
            if (!value) {
                return null;
            }
            // use self
            return value * self.multiper;
        };
        this.decimalToPercent = decimalToPercent;
    }
}

或者可能最简单的解决方案是使用bind在构造函数中并将该函数编写为常规方法:

class X {

    decimalToPercent(value: number): number;
    decimalToPercent(value: null): null;
    decimalToPercent(value: number | null): number | null {
        if (!value) {
            return null;
        }
        return value * this.multiper;
    };
    multiper = 100;
    constructor() {
        this.decimalToPercent = this.decimalToPercent.bind(this);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打字稿重载箭头功能不起作用 的相关文章

随机推荐

  • 手动为 boost 的图表着色

    我正在努力尝试使用 boost 手动为图的顶点着色 我写了下面的代码 但我不明白为什么生成的文件没有任何颜色 int main int char typedef property
  • 为什么不能在循环中隐藏局部变量?

    我遇到了这种情况 我无法理解阴影 例如下面的代码 class Foo int a 5 void goFoo int a No problem naming parameter as same as instance variable for
  • 构建管道的保存被禁用

    我已经填写了构建管道的所有选项 并且没有错误消息 如何找出 保存 按钮被禁用的原因 如果我转到顶部菜单上的 触发器 那么我可以在 持续集成 下看到一些需要注意的设置 在我的屏幕截图中 红色的小错误图标实际上在 触发器 一词的映衬下可见 您必
  • 在 Razor 邮件模板中使用 @Html.Raw 渲染 HTML 内容

    使用 Razor 页面作为邮件模板我尝试使用显示邮件内容 Html 内容 Html Raw Model Content 每当我运行代码时 我都会收到此错误 html does not exist in current context 我试过
  • 如何获取 CheckboxColumn Gridview 中选定的数据/项目行 - Yii2

    我在使用 checkboxColumn 获取所有选定值 数据 Yii2 Gridview 时遇到问题 我只能得到one of the value in the grid使用此代码 class gt yii grid CheckboxColu
  • 转换器类抛出异常 java.lang.IllegalArgumentException

    我的 JSF 页面中有 p selectOneMenu 当我运行 JSF 页面时 我从 Converter 类中收到以下异常 java lang IllegalArgumentException object 5634 is of type
  • QWidget::find 可以从不同的进程中查找小部件吗?

    的文档QWidget winId状态 除其他外 如果一个小部件是非本机 外星人 并且在其上调用 winId 则将为该小部件提供本机句柄 我不确定 外星人 在这种情况下意味着什么 但我现在选择忽略它 因此 假设我的小部件现在有一个与之关联的有
  • 用于选择发件人和签名的 VBA 代码

    在 Excel 中 我使用如下代码通过 Outlook 开始发送电子邮件 Set mOutlookApp GetObject Outlook application Set OutMail mOutlookApp CreateItem 0
  • iOS/Swift:PFFacebookUtils.logInWithPermissions 返回 nil 用户和错误

    在我的应用程序中 我通过 Parse 的 PFFacebookUtil 类登录用户 如果用户存在于手机上 即在 设置 gt Facebook 中登录 FB 则一切都会按预期进行 但如果他们是未通过设置登录 然后用户被带到 Web 视图进行登
  • 对于 CUDA 的嵌套循环

    我遇到了一些 for 嵌套循环的问题 我必须将其从 C C 转换为 CUDA 基本上我有 4 个 for 嵌套循环 它们共享相同的数组并进行位移操作 define N 65536 int a1 a2 a3 a4 i1 i2 i3 i4 in
  • Firebase Cloud Firestore REST api 身份验证仅使用 WEB API 密钥?

    我正在尝试通过其 REST API 和curl 在 Firebase Cloud Firestore 数据库中插入新记录 由于操作是公开的 因此从数据库中读取数据可以按预期进行 创建操作未在数据库规则中列出 并且仅在服务器端执行 但我无法仅
  • jQuery .hover 不工作

    嗨 我的代码有什么问题 当我将鼠标悬停在 open 上时 pull down content 应该从标题向下移动页面 当我离开 open 时 它应该向上移动 但是 当我在页面加载后测试代码时 pull down content 在我将鼠标悬
  • 如果另一个工作表中存在行值,则删除多个工作表中的行值

    下面的代码来自这个答案post关于将行值复制到新工作表 如果它存在于其他工作表中 现在 如果我不想将重复值复制到工作表 3 而是想从工作表 1 和工作表 2 中删除它们 如果工作表 3 中存在 该怎么办 电子表格 我有3张 将在前两张纸上进
  • 锁定和解锁互斥体的效率如何?互斥体的成本是多少?

    在低级语言 C C 或其他语言 中 我可以选择使用一堆互斥体 如 pthread 提供的或本机系统库提供的任何内容 或对象的单个互斥体 锁定互斥体的效率如何 IE 可能有多少条汇编指令以及它们需要多少时间 在互斥体解锁的情况下 互斥体的成本
  • GAS 汇编程序分段错误(写入自动变量)

    我打算在 C 中执行此操作 include
  • 在java中,您可以使用带有必填字段和可重新分配字段的构建器模式吗?

    这与以下问题相关 如何改进构建器模式 我很好奇是否可以实现具有以下属性的构建器 部分或全部参数为必填项 没有方法接收许多参数 即 没有向初始构建器工厂方法提供默认值列表 所有构建器字段都可以重新分配任意次数 编译器应该检查所有参数是否已设置
  • 扩展 MySQLi 类

    我希望能够创建扩展 MySQLi 类的类来执行其所有 SQL 查询 mysql new mysqli localhost root password database or die error connecting to the datab
  • SQL:根据变量选择动态列名

    我有一个 Microsoft SQL 存储过程 我想通过传递给它的变量来设置其列名 CREATE PROCEDURE My Procedure myDynamicColumn varchar 50 AS BEGIN SELECT value
  • 只有背景图像必须在页面加载时淡入

    我有一个带有背景图像 箭头 的 div div 中有一些文本 箭头位于其下方 我希望 div 内的文本随页面一起加载 但背景图像会在几秒钟后加载 这是我的代码 homearrow background url http www stefaa
  • 打字稿重载箭头功能不起作用

    我正在使用严格的空检查 我有以下带有重载类型的箭头函数 type INumberConverter value number number value null null const decimalToPercent INumberConv