键入以将新项目推送到数组中

我有一个模型类,它管理一个内部属性_record,它是来自数据库的记录。模型类是一个通用基类,每个模型类型都扩展了这个基类。

我想提供两种方便的方法来修改记录上的属性:setValue用于设置离散数据结构和pushValue将离散数据结构推送到数组。

/**
 * Allows setting individual properties on the record
 * 
 * @param key the property on the record you want to set
 * @param value the value of the property
 */
public setValue<K extends keyof T>(key: K, value: T[K]) {
  this._record[key] = value;
}

/**
 * Allows setting an individual property on a record where the property
 * must be an array and result of the operation is the addition 
 * of a new array element
 * 
 * @param key the property name on the model's record
 * @param value an element to add to the existing array
 */
public pushValue<K extends keyof T>(key: K, value: keyof T[K]) {
  if (!this._record[key]) {
    this._record[key] = [ value ] as T[K];
  } else if (Array.isArray(this._record[key])) {
    this._record[key] = this._record[key].concat(value);
  }
}

setValue工作正常,但我用了适当的分型挣扎pushValue错误是:错误 1

错误 2

我正在使用 Typescript 2.4.0

阿尔特姆

Array.isArray(this._record[key])不作为类型保护工作,this._record[key]仍然T[K]在它之后输入,可能是因为索引属性访问(这里报告了类似的问题:https : //github.com/Microsoft/TypeScript/issues/11483,分辨率“由于性能原因而下降”。)

针对该问题的建议解决方法是传递中间变量而不是this._record[key]类型保护,它确实有效。对于一个简单的变量,它的类型被推断为const v: T[K] & any[],其中any[]一部分来自Array.isArray类型保护,因此此代码编译为--noImplicitAny

abstract class Model<T> {

    _record: T;

    public setValue<K extends keyof T>(key: K, value: T[K]) {
        this._record[key] = value;
    }


    public pushValue<K extends keyof T, V>(key: K, value: V) {
        const v = this._record[key];
        if (!v) {
            this._record[key] = [value] as any;
        } else if (Array.isArray(v)) {
            v.push(value);
        }
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将新项目推送到JSON数组中

来自分类Dev

如何使用Firebase将新项目推送到数组中

来自分类Dev

将新项目推送到mongoDB文档数组

来自分类Dev

如何将新项目推送到空数组?

来自分类Dev

使用 React Hooks 保持现有但将新项目推送到数组中

来自分类Dev

将新项目从字段推送到对象

来自分类Dev

在NativeScript中触发socketio事件后如何将新项目推送到lisview中

来自分类Dev

如何将新项目代码推送到现有 github 存储库中的特定分支?

来自分类Dev

mergeDeepIn()将新项目推送到immutable.js中的列表

来自分类Dev

将新项目更改推送到github无法正常工作

来自分类Dev

将本地分支推送到远程上的新项目

来自分类Dev

将项目推送到数组中并以javascript返回

来自分类Dev

Ajax回发后将项目推送到数组中

来自分类Dev

使用Mongoose将项目推送到对象中的数组

来自分类Dev

如何将项目推送到 Kotlin 中的数组?

来自分类Dev

Angular 5,Clarity Design - 将新项目推送到选项数组时,选择选项“消失”

来自分类Dev

将项目推送到嵌套对象数组

来自分类Dev

fetch:将项目推送到数组

来自分类Dev

Vue JS将项目推送到数组?

来自分类Dev

通过新数组映射然后将项目推送到现有数组中的对象

来自分类Dev

无法将项目推送到状态内的项目数组

来自分类Dev

将JSON数据推送到数组中?

来自分类Dev

GitHub:无法将新项目推送到仓库,出现绿色按钮“比较和拉取请求”

来自分类Dev

React Native-将新项目推送到现有的AsyncStorage密钥?

来自分类Dev

如何根据多个复选框列表中的选中值将多个项目推送到数组?

来自分类Dev

使用键值将项目推送到类型为crip的数组中

来自分类Dev

如何将项目推送到作为数组的 es6 Map 对象值中?

来自分类Dev

将项目推送到数组并在同一请求中删除

来自分类Dev

如何将项目推送到键为“指定键”的数组中?

Related 相关文章

  1. 1

    将新项目推送到JSON数组中

  2. 2

    如何使用Firebase将新项目推送到数组中

  3. 3

    将新项目推送到mongoDB文档数组

  4. 4

    如何将新项目推送到空数组?

  5. 5

    使用 React Hooks 保持现有但将新项目推送到数组中

  6. 6

    将新项目从字段推送到对象

  7. 7

    在NativeScript中触发socketio事件后如何将新项目推送到lisview中

  8. 8

    如何将新项目代码推送到现有 github 存储库中的特定分支?

  9. 9

    mergeDeepIn()将新项目推送到immutable.js中的列表

  10. 10

    将新项目更改推送到github无法正常工作

  11. 11

    将本地分支推送到远程上的新项目

  12. 12

    将项目推送到数组中并以javascript返回

  13. 13

    Ajax回发后将项目推送到数组中

  14. 14

    使用Mongoose将项目推送到对象中的数组

  15. 15

    如何将项目推送到 Kotlin 中的数组?

  16. 16

    Angular 5,Clarity Design - 将新项目推送到选项数组时,选择选项“消失”

  17. 17

    将项目推送到嵌套对象数组

  18. 18

    fetch:将项目推送到数组

  19. 19

    Vue JS将项目推送到数组?

  20. 20

    通过新数组映射然后将项目推送到现有数组中的对象

  21. 21

    无法将项目推送到状态内的项目数组

  22. 22

    将JSON数据推送到数组中?

  23. 23

    GitHub:无法将新项目推送到仓库,出现绿色按钮“比较和拉取请求”

  24. 24

    React Native-将新项目推送到现有的AsyncStorage密钥?

  25. 25

    如何根据多个复选框列表中的选中值将多个项目推送到数组?

  26. 26

    使用键值将项目推送到类型为crip的数组中

  27. 27

    如何将项目推送到作为数组的 es6 Map 对象值中?

  28. 28

    将项目推送到数组并在同一请求中删除

  29. 29

    如何将项目推送到键为“指定键”的数组中?

热门标签

归档