如何修复“属性没有初始值设定项并且未在构造函数中明确分配”错误?

2024-03-31

我对这些课程有疑问。我想使用该方法doSomething()班级独有B无需每次都进行类型转换,但是当我指定属性时a属于类型B,它告诉我它没有在构造函数中分配,这有点错误,因为父构造函数进行了分配。

class A {

}

class B extends A {
  doSomething() { }
}

class One {
  constructor(protected a: A){  }
}

class Two extends One {
  protected a: B // Property 'a' has no initializer and is not definitely assigned in the constructor.

  constructor(){
    super(new B());
    // If I enter "this.a = new B();" here then the error disappears, but the code is redundant.
  }

  doStuff() {
    this.a.doSomething()
  }
}

我究竟做错了什么?

操场 https://www.typescriptlang.org/play?#code/MYGwhgzhAECC0G8BQSC%20LSRgIWgUwA8AXPAOwBMZ5lppyB7AZXoFs8iALAS1IHMAKAJSJo6dEkxRoAeVJ5ESWsHqkIRAE4BXYEXrr%20AB3X0SOvOWhgAXHEEJaYjOCkAVAO718xMpRlyFtEYmeGYW1tC4APSR0AAKxgZ46kQAntAA5GDp0ByQ0KSePFxEXGAgXABeSZYU0FwwBUR0eABmRSQgaVhcvHIWPNCc8sqqGtq66gB0KEoqalo6ekI0tNAQmon6cm4RQoIA3Iqr0dAAki1n%20KQk6tAARJz1k2DQALz5eDvYQvt3OUnyIakQYceRJYy3cj1MAGRJgdQQAA00AARpomkNoMpyPJ6tB1OZNBQwNdpg4ZnQmERNC0WkIAqtHhBnpMGMw2I8%20EIjmIgA


问题是提议添加类字段声明 https://github.com/tc39/proposal-class-fields#class-field-declarations-for-javascriptJavaScript 的语义与您可能期望的语义以及 TypeScript 设计者将它们添加到 TypeScript 时的期望不同。事实证明,在 JavaScript 中,类字段声明将通过以下方式初始化Object.defineProperty() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty而不是通过赋值,所有此类没有初始化器的声明字段都将被初始化为undefined。所以最终你可以期望像你这样的代码生成设置的 JavaScripta to undefined在子类中,即使您的目的只是缩小基类的类型。布莱奇。

所以,在 TypeScript 3.7 中,a --useDefineForClassFields添加了标志,以及declare属性修饰符 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#the-usedefineforclassfields-flag-and-the-declare-property-modifier。如果你使用--useDefineForClassFields,编译器将输出符合预期的代码Object.defineProperty()类字段的语义:

如果你使用该标志按原样运行您的代码 https://www.typescriptlang.org/play?useDefineForClassFields=true#code/MYGwhgzhAECC0G8BQSC+LSRgIWgUwA8AXPAOwBMZ5lppyB7AZXoFs8iALAS1IHMAKAJSJo6dEkxRoAeVJ5ESWsHqkIRAE4BXYEXrr+AB3X0SOvOWhgAXHGEJRaDOCkAVAO718xMpRlyFtEYmeGYW1tC4APSR0AAKxgZ46kQAntAA5GDp0ByQ0KSePFxEXGAgXABeSZYU0FwwBUR0eABmRSQgaVhcvHIWPNCc8sqqGtq66gB0KEoqalo6ekIBtNAQmon6cm4RQoIA3Iqr0dAAki1n+KQk6tAARJz1k2DQALz5eDvYQvt3OUnyIakQYceRJYy3cj1MAGRJgdQQAA00AARpomkNoMpyPJ6tB1OZNBQwNdprRxLQGIwiJoWi1ljRVo8IM9JlTWOxuHwhEcxChttB3PQhGymDS6UIgA,你会在运行时看到这个问题:

new Two().doStuff()
// [ERR]: "Executed JavaScript Failed:" 
// [ERR]: this.a is undefined 

解决方案是使用declare属性修饰符缩小子类属性而不发出任何相应的Object.defineProperty() code:

class Two extends One {
  declare protected a: B // okay

  constructor() {
    super(new B());
  }

  doStuff() {
    this.a.doSomething()
  }
}

new Two().doStuff(); // okay now

Playground 代码链接 https://www.typescriptlang.org/play?useDefineForClassFields=true#code/MYGwhgzhAECC0G8BQSC+LSRgIWgUwA8AXPAOwBMZ5lppyB7AZXoFs8iALAS1IHMAKAJSJo6dEkxRoAeVJ5ESWsHqkIRAE4BXYEXrr+AB3X0SOvOWhgAXHGEJRaDOCkAVAO718xMpRlyFtOR4mOryRibBJBbW0LgA9HHQ9ADWYACeKEoqalo6ekIBtNAQmgZ4+nJusUKCANyKDg0MjESaAGZtBTRFnFwQAHRg-c2s7Nx8Qg1iKJXQ7vRCw0ytHQUJ0KSe5cbqQA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复“属性没有初始值设定项并且未在构造函数中明确分配”错误? 的相关文章

随机推荐

  • FFMPEG 在视频末尾添加图像

    我需要使用 FFMPEG 在 mp4 视频文件末尾添加一秒钟的图像 我的视频尺寸是 WxH 图像尺寸是 MxM 因此视频和图像尺寸不同 我尝试了不同的选项 以便在视频末尾添加图像 ffmpeg i concat videoIn mp4 im
  • iOS 将照片保存在应用程序特定的相册中

    我正在创建一个 iOS 5 应用程序 我想将照片保存到设备中 我想将照片保存到我的应用程序特定的相册中 因此我需要创建相册 然后将照片保存到相册中 我知道如何创建相册 ALAssetsLibrary library ALAssetsLibr
  • R:加速“group by”操作

    我有一个模拟 中间有一个巨大的聚合和组合步骤 我使用 plyr 的 ddply 函数对这个过程进行了原型设计 它可以很好地满足我的大部分需求 但我需要更快的聚合步骤 因为我必须运行 10K 次模拟 我已经在并行扩展模拟 但如果这一步骤更快
  • 设计:新错误(可加密)

    我已经一周没有碰过我的代码了 但是当我捆绑并尝试运行我的网络服务器时 我现在收到以下错误 这让我死在了水里 按照错误输出中的建议包含可设计加密的 gem 并不能解决问题 并且仍然会导致相同的错误 任何帮助是极大的赞赏 DEVISE Devi
  • Reactjs:使用 shouldComponentUpdate() 停止在特定状态更改时重新渲染

    我的组件 onload 中有多个 setState 我的页面在单击下拉值时重新呈现 因为单击时我通过以下方式存储这些值setState 为了停止点击时重新渲染 我使用下面的代码 shouldComponentUpdate return fa
  • Nginx 反向代理配置

    我在使用 nginx 进行简单配置时遇到问题 我有一台托管 docker 容器的服务器 因此 nginx 位于容器中 所以我们调用 urlfoo com 我想要网址foo com service1实际上只是去另一个端口上的 foo com
  • CSS 中如何使用“大于”或“>”字符?

    我在 CSS 文件中多次看到这个字符 但我不知道它是如何使用的 谁能向我解释一下并展示它们如何使页面样式变得更容易 这是一个 CSS 子选择器 P gt SPAN表示将以下样式应用于作为子级的所有 SPAN 标记P tag 请注意 孩子 的
  • Visual Studio Code 中是否有像 DocBlockr 这样的代码注释功能?

    我使用 Sublime Text 3 Atom io 和 Bracket io 作为以前的编辑器 我也非常喜欢新的 Mac 版 Visual Studio 代码编辑器 Sublime 有类似 DocBlockr 的代码注释功能吗 这对我来说
  • Android Studio 0.5.9错误代码42

    每次我尝试从 eclipse 导入项目时 我都会收到这样的错误 Error Execution failed for task app mergeDebugResources 错误 无法运行命令 D Android sdk build to
  • 如何优化间接基数排序? (又名如何优化不可预测的内存访问模式)

    我用 C 编写了一个间接基数排序算法 间接 我的意思是它返回项目的索引 include
  • Kubernetes TLS 秘密证书过期

    我使用 openssl 创建通配符自签名证书 我将证书有效期设置为 到十年 我通过使用 openssl 检查证书来仔细检查有效期 我使用步骤 1 中准备的私钥和证书创建一个 Kubernetes 密钥 如下所示kubectl命令 kubec
  • 如何从ocaml列表中获取子列表

    我正在查看列表文档 图书馆好像没有提供sublist功能 我正在尝试从中获取元素列表i to j 现在我必须把它写成 let rec sublist list i j if i gt j then else List nth list i
  • 如何解析会导致非法 C# 标识符的 JSON 字符串?

    我一直在使用NewtonSoft JSON 转换 http james newtonking com json用于解析 JSON 字符串并将其转换为 C 对象的库 但现在我遇到了一个非常尴尬的 JSON 字符串 我无法将其转换为 C 对象
  • JavaMail 与 Oauth 和 Office365

    我正在用 Java 构建一个简单的命令行应用程序 它可以登录我的电子邮件箱 IMAP 并下载所有附件 我使用了基本身份验证 但 Microsoft 正在禁用它 因此我尝试将我的应用程序转换为使用 OAuth 在阅读了不同的 OAuth 流程
  • 部署时出现 aws beanstalk 403 错误

    您好 我正在使用亚马逊网络服务弹性豆茎 每次我使用 git aws push 时 我的 php 应用程序都会成功上传但是 当我单击 url 时 它会显示 Forbidden You don t have permission to acce
  • 自旋锁与忙等待[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 请解释原因忙碌等待通常不受欢迎 而Spinning通常被认为还可以 据我所知 它们都会无限循环 直到满足某些条件 A 自旋锁通常在资源争用较少时
  • 使用Mysql lower_case_table_names为1

    我已经使用 yum 在 linux 中安装了 mysql v5 5 17 现在我想要默认的小写表名 所以我添加了 set variable lower case table names 1 in etc my cnf 但如果我这样做 我就无
  • 获取安装目录安装盾

    我想通过安装盾来创建我的设置 我使用命令参数Setup exe path SETUPEXEDIR log txt我的设置位置是Desktop myapp Setup exe使用 SETUPEXEDIR 时返回临时文件夹 我希望在使用 SET
  • 为什么我不能让单个 Redis 客户端在同一连接中充当 PUB 和 Sub ?

    我的思维模型是 聊天 我订阅了某个频道 并且可以向该频道发布消息 由于 pub sub 是异步的 因此发布的消息可能随时出现 包括当您期望命令响应时 尽管 Redis 是单线程的 通常会阻止此类事情 但网络延迟可能会导致一些有趣的影响 根据
  • 如何修复“属性没有初始值设定项并且未在构造函数中明确分配”错误?

    我对这些课程有疑问 我想使用该方法doSomething 班级独有B无需每次都进行类型转换 但是当我指定属性时a属于类型B 它告诉我它没有在构造函数中分配 这有点错误 因为父构造函数进行了分配 class A class B extends