是否可以在打字稿中创建动态 getter/setter?

2024-01-14

我是 TypeScript 新手,我正在尝试将我们的应用程序从 es2016 重写为 TypeScript。 我的任务是拥有一个具有数据属性的类,并使数据对象中的每个元素可用作类属性。

我被这段 JavaScript 代码困住了:

for(let key in this.data) {
  Object.defineProperty(this, key, {
    get: function(value:any) { return this.data[key]; },
    set: function(value:any) {
      if (this.data[key] !== value) {
        this.data[key] = value;
        this.updatedKeys.push(key);
      }
    },
  });
}

使用打字稿的 getter/setter 非常容易,但我很困惑是否可以动态创建它们?

interface IData {
  id: number;
  [propName: string]: any;
}

class Model  {
  
  protected updatedKeys:string[] = [];
  
  baseUrl:string = null;
  data:IData;
  fields:IData;
  
  constructor(data:IData={id:null}, fields:IData={id:null}) {
    super();
    this.data = data;
    this.fields = fields;
    
    for(let key in this.data) {
      Object.defineProperty(this, key, {
        get: function(value:any) { return this.data[key]; },
        set: function(value:any) {
          if (this.data[key] !== value) {
            this.data[key] = value;
            this.updatedKeys.push(key);
          }
        },
      });
    }
  }
}

tsc -t ES2016 --lib "es2016","dom" models.ts

会给出这个错误:

models.ts(33,40): error TS2345: Argument of type '{ get: (value: any) => any; set: (value: any) => void; }' is not assignable to parameter of type 'PropertyDescriptor & ThisType<any>'.
  Type '{ get: (value: any) => any; set: (value: any) => void; }' is not assignable to type 'PropertyDescriptor'.
    Types of property 'get' are incompatible.
      Type '(value: any) => any' is not assignable to type '() => any'.

而且我不知道如何摆脱这个问题。


感谢https://github.com/epicgirl1998 https://github.com/epicgirl1998,她帮助我找到了解决方案。我将其发布在这里:

错误是 getter 有一个值参数,即使 getters 没有传递任何值

我用 get 替换了它: function() { return this.data[key]; }, 现在 唯一的错误是类中有一个 super 调用,它只是 如果该类扩展另一个类则需要

另外,访问器中的 this 并不引用类实例, 但使用箭头函数应该可以解决这个问题

尝试这个:

interface IData {
  id: number;
  [propName: string]: any;
}

class Model  {
  
  protected updatedKeys:string[] = [];
  
  baseUrl:string = null;
  data:IData;
  fields:IData;

  constructor(data:IData={id:null}, fields:IData={id:null}) {
    
    this.data = data;
    this.fields = fields;
    
    for(let key in this.data) {
      Object.defineProperty(this, key, {
        get: () => { return this.data[key]; },
        set: (value:any) => {
          if (this.data[key] !== value) {
            this.data[key] = value;
            this.updatedKeys.push(key);
          }
        },
      });
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在打字稿中创建动态 getter/setter? 的相关文章

  • PHP Define() 似乎不能与 include() 一起使用

    我一直在尝试 OO PHP 目前拥有三个文件 我有一个 class lib php 目前它只有一个databaseServer 类 一个index php 文件和一个definitions php 文件 我想将所有敏感数据库信息放入定义文件
  • Node.js 10 的 TypeScript tsconfig 设置?

    有谁知道 Node js v10 x 需要哪些目标 库才能在没有生成器的情况下使用内置的 async await 我看到很多关于节点 8 的信息 但没有看到关于节点 10 的信息 从 Node js 开始10 0 0 100 支持ES201
  • 从版本 14 更新到 15 后,Angular $localize 错误

    从版本更新我们的 Angular 应用程序后14 0 4到版本15 1 3 之前也尝试过15 1 2 我们在尝试访问该应用程序时收到以下错误 Uncaught Error It looks like your application or
  • Python 类中的继承顺序

    我有课ExampleSim它继承自基类Physics class Physics object arg1 arg1 def physics method print physics method class ExampleSim Physi
  • 使用字符串枚举来扩展 keyof

    我在理解使用字符串枚举来索引类型时的行为时遇到了一些困难 似乎有时 TS 会识别字符串枚举的值是keyof某些类型 有时则不然 为了显示 enum Key FOO foo type MyObj foo string 因此 类型属性的枚举 即
  • “未知”与“任何”

    TypeScript 3 0 引入unknown根据他们的 wiki 输入 未知现在是保留类型名称 因为它现在是内置类型 根据您对未知的预期用途 您可能需要删除 完全声明 有利于新引入的未知类型 或者 将其重命名为其他名称 有什么区别unk
  • Angular 没有 NameService 提供者

    我在将类加载到 Angular 组件中时遇到问题 我已经尝试解决这个问题很长时间了 我什至尝试过将所有内容合并到一个文件中 我所拥有的是 应用程序 ts
  • 打字稿 - 找不到导出

    我在模块 A 中有这个 Typescript 文件 somefile tsx import remAuto from tidee life theme 在模块 B 中 我导出了 index js 文件remAuto index js imp
  • 如何在 package.json 中对嵌套子模块和 TypeScript 使用“导出”?

    我想利用新的优势 出口 https nodejs org api packages html packages exportsNode js 的功能package json这样我就可以执行以下操作 exports dist index js
  • Django modelAdmin __init__ 和内联

    嘿 我对 Django 相当陌生 我正在寻找动态编辑管理类变量 完整的想法是在添加时隐藏内联 仅在编辑时显示 但我在这里提炼这个问题 有人可以解释为什么这不起作用吗 class dbTablePermissionInline admin T
  • Python 类 __div__ 问题

    元组代表分数 我试图通过乘以倒数来除以分数 class Test def init self self x 1 2 def div self div fraction return self x 0 div fraction 1 self
  • (在 Ruby 中)允许混合类方法访问类常量

    我有一个为其定义常量的类 然后我定义了一个类方法来访问该类常量 这很好用 一个例子 usr bin env ruby class NonInstantiableClass Const hello world class lt lt self
  • Svelte:无法识别导入的 TypeScript 文件

    我正在尝试使用 Rollup 使用 Svelte 和 TypeScript 构建一个应用程序 当我尝试构建我的 Svelte 组件时 我似乎无法让它编译我的 ts包含的文件 svelte成分 我不断收到此错误 Error Unexpecte
  • 在Python中将字典转换为以键作为对象名称的对象

    我有一本这样的字典 d item1 Hi 150 495 item2 Hola 590 40 我想将其转换为对象 如果可能的话递归地 我有一堂课 class Item def init self thetuple self greeting
  • Angular 中的文件输入事件类型

    所以我已经使用 Angular 和 Typescript 很长时间了 我似乎无法找出输入文件的类型是什么 例如
  • 我应该使用课程吗? (Python)

    我正在尝试编写一个包含一些数学函数的小型 Python 模块 例如 它可能包含如下函数 def quad x a b c return a x 2 b x c 您可能会注意到它包含几个参数 即a b c 除了变量x 现在 如果我将其放入文件
  • 通过扩展和实现的组合来理解 TS 的类型推断/缩小

    我有以下示例代码 class B implements Error name string message string stack undefined string function Foo x any if x instanceof E
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • 使用打字稿的 Angular 6 的黄金布局?

    我在用黄金布局 https golden layout com 与 Angular 6 一起 如下本教程 https npm taobao org package embedded enterprises ng6 golden layout

随机推荐

  • 如何在文件中给出的单词中查找字谜

    如何在文件中给出的单词中查找字谜 我的解决方案 对它们进行排序 然后查找重复项 O n mlgm n 单词数 m 单词的最大大小 还有更好的解决方案吗 thanks 这是一个没有排序的解决方案 我想我想出了一个新的解决方案 它使用算术基本定
  • 无法连接到(IP或域名)上的MySQL服务器

    我正在尝试配置网络服务器 Debian 7 我跟着这个tutorial http olange developpez com articles debian installation serveur dedie page page 2 感谢
  • 配置ElasticSearch的端口号

    我们使用 ElasticSearch 0 20 2 并使用以下命令运行守护进程 bin elasticsearch f bin elasticsearch脚本自己设置ES HOME 似乎没有办法 影响配置文件读取的路径 ES 总是从以下位置
  • 更新 Dojo 提供

    我在一个项目中使用 Dojo 1 9 但我不明白正确的替代方案dojo provide与传统风格相比 AMD 风格 我正在读书this http dojotoolkit org reference guide 1 9 dojo provid
  • Python 深度嵌套工厂函数

    在 学习Python 中遇到了工厂函数 本教科书示例有效 def maker N def action X return X N return action gt gt gt maker 2
  • 将字符串中的数字范围替换为单个数字

    有没有办法将字符串中的数字范围替换为单个数字 数字的范围可以是 n n 最有可能是 1 15 也可以是 4 10 范围可以用 a 表示 a lt I would like to buy 1 3 cats 或与单词 b 一起使用 例如 to
  • 跨两个数据源的事务管理(ChainedTransactionManager)-SpringBoot

    为什么 Spring ChainedTransactionManager 被弃用 spring 是否提供任何替代库来支持多个事务管理器 我的用例 我们正在构建一个连接到两个数据源 db1 和 db2 的 Spring Boot 应用程序 它
  • 正确停止 Tika 服务器

    为了启动可以从 localhost 以外的主机访问的 Tika 服务器 我们知道要走的路是 假设我有版本 1 7 并且想要在端口 9998 上运行 java jar tika server 1 7 SNAPSHOT jar host 0 0
  • 未捕获的类型错误:$(...).owlCarousel 不是函数

    我已将 owlCarousel 添加到我的页面 但我收到这个错误 并坚持了几个小时 HTML code custom js 中的函数 owl hero owlCarousel navigation true Show next and pr
  • 如何从 Twitter API 和趋势线获取关注者数量

    我正在为 Twitter 编写一些关于随时间推移的关注者数量的报告 但是经过大量搜索和反复试验后 我无法获得随时间推移的关注者数量 特别是过去的关注者数量 我知道有一个 API 可以获取关注者的个人 userId 但这对于我的需要来说有点过
  • Jenkins Subversion 签出失败 - “E175002:CRLF 预计在块末尾:-1/-1”

    我有一个 Jenkins v2 107 2 实例 作为 Windows 服务运行 它正在通过 Subversion 从 Visual SVN 服务器 在单独的 Windows PC 上 检查多个项目 其中一个项目 最大的 2 7GB 偶尔会
  • 如何使用 jquery 在 iframe 中选择标签?

    我试图弄清楚如何选择然后修改 HTMLiframe我生成 iframe 显示各种媒体 图像 pdf 等 为了显示不同的项目 我最初使用如下方式创建它 mydiv html 然后 根据需要 使用如下内容更新其内容 myiframe attr
  • 用于在 HTML 表中查找行索引的 jQuery 语法

    1 如何查找 HTML 表格中的行号 索引 生成的表没有任何行 ID 例如 我生成了一个纯 HTML 表格 其中有 10 行 我正在向该表动态添加行 在现有行之间 由于我要添加新行 现有的行索引将会更改 现在我需要在添加新行之前找到每行的索
  • 如何避免在 Windows 中过度填充 PATH 环境变量?

    我想知道您使用什么方法来管理系统中的可执行文件 例如 我几乎可以通过命令行访问所有内容 但现在我遇到了路径字符串的限制 因此我无法添加更多目录 那么你有什么推荐呢 很久以前 我尝试在属于该路径的目录中使用可执行文件的软链接 但这种方法不起作
  • 是否可以对两个转换字符组合使用格式修饰符?

    我知道如何使用 log4j 输出类名和方法名 这两个字段都可以单独对齐和填充 例如这个模式 d ISO8601 5p 10C 1 10M m n 产生类似的东西 2012 09 20 08 25 12 111 WARN Class meth
  • Windows 无法在本地计算机上启动 Apache CouchDB 服务

    我已在 Windows 计算机上安装了 CouchDB 但在启动 CouchDB 服务时 我收到如下消息 Windows 无法在本地计算机上启动 Apache CouchDB 服务 该服务没有返回错误 这可能是 Windows 内部错误或内
  • 使用bundle运行gitlab服务器:命令未找到错误

    我不知道发生了什么 sudo 服务 gitlab 启动 Starting both the GitLab Unicorn and Sidekiqscript web line 21 bundle command not found 查看我的
  • 如何在 cygwin 上安装 cURL?

    我尝试在 cygwin 上启用curl 但它说bash curl command not found 如何在 cygwin 上安装curl 我刚刚遇到这个 1 从以下位置找到cygwin setup exe文件http cygwin com
  • 使文本高度为 div 的 100%?

    我正在尝试使文本的高度为 100 div但它不起作用 它只是变成了100 body font size 有什么办法让它跟随div高度吗 The div高度是整个页面的 4 当您调整大小 更改分辨率时 我不希望文本跟随它 为了获得我想要的结果
  • 是否可以在打字稿中创建动态 getter/setter?

    我是 TypeScript 新手 我正在尝试将我们的应用程序从 es2016 重写为 TypeScript 我的任务是拥有一个具有数据属性的类 并使数据对象中的每个元素可用作类属性 我被这段 JavaScript 代码困住了 for let