受保护属性的通用 getter 和 setter

2024-05-02

考虑这个 TypeScript 类,它通过将实现分为超类和子类来提供类型检查的通用 getter 和 setter:

class ICompetence {
    protected _id : number | undefined;
    protected name: string | undefined;
}

export default class Competence extends ICompetence {

    set<K extends keyof ICompetence>(key: K, value: ICompetence[K]): void {
        this[key] = value;
    }

    get<K extends keyof ICompetence>(key: K) : ICompetence[K] {
        return this[key];
    }

    constructor() {
        super();
    }
}

该类的使用方式如下:

let competence = new Competence():    
competence.set("name", "name value text");

但是,然后我收到此错误:

error TS2345: Argument of type '"name"' is not assignable to parameter of type

可以通过删除接口类中受保护的注释来克服该错误:

class ICompetence {
    _id : number | undefined;
    name: string | undefined;
}

TypeScript 是否提供了任何功能来避免在属性受到保护时发生这种错误?


Since protected仅在设计时生成错误,并且不会阻止运行时的访问,您可能会通过另一种方式获得类似的行为hiding导出类型的相关属性,如下所示:

首先,将父类的属性公开:

class ICompetence {
  _id: number | undefined;
  name: string | undefined;
}

然后正常扩展该类,但不导出它,并将其重命名为_Competence(“真实的”Competence稍后会来)

class _Competence extends ICompetence {

  otherProperty: string = "hmm"; // demonstrate you can add other things

  set<K extends keyof ICompetence>(key: K, value: ICompetence[K]): void {
    this[key] = value;
  }

  get<K extends keyof ICompetence>(key: K): ICompetence[K] {
    return this[key];
  }

  constructor() {
    super();
  }
}

现在我们准备Competence。首先我们定义类型函数Omit,它从类型中删除指定的键:

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>

然后我们导出一个名为Competence和一个名为Competence,它们源自_Competence但不要暴露来自的属性ICompetence。当然,它们仍然存在,但类型系统不会公开它们:

export interface Competence extends Omit<_Competence, keyof ICompetence> { }
export const Competence = _Competence as new () => Competence;

现在,在您的消费者代码中,您应该能够执行以下操作:

const competence = new Competence();
competence.name // error at compile time
competence.otherProperty // okay
const name = competence.get("name") // string or undefined

它有效。希望有帮助。祝你好运!

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

受保护属性的通用 getter 和 setter 的相关文章

随机推荐

  • 自动化 Windows UI 测试方法

    我们正在寻求设置自动化 UI 测试 并想知道最好的方法是什么 潜在的陷阱是什么 设置费用是否昂贵 提前致谢 B 自动化测试最大的消耗可能是时间 有很多非常昂贵的工具 但也有免费的工具 即使是昂贵的工具的成本也不太可能与正确设置自动化测试所需
  • 如何处理Spring Boot中的SQLIntegrityConstraintViolationException?

    我正在 RestController 工作 尝试使用 try catch 块处理 SQLIntegrityConstraintViolationException 但我不知道为什么 catch 块从未执行 这是休息控制器 import ja
  • 使用 socket.io node.js 和传入消息的通知系统的架构实现和设计

    免责声明 我之前没有使用过node js 我以前没有使用过socket io 我正在考虑实现 Google Plus Facebook StackOverflow 风格的通知系统 我不是一个没有经验的开发人员 最终我会解决这个问题 但我只是
  • 增加android中的网格间距

    我有一个网格视图 其中三列中有很多项目 我想增加它们之间的间距 我怎样才能在安卓中做到这一点 您可以使用android verticalSpacing and android horizontalSpacing在 GridView 标记中并
  • Letrec 和可重入延续

    有人告诉我 以下表达式的计算结果为 0 但许多方案的实现将其计算为 1 let cont f letrec x call with current continuation lambda c set cont c 0 y call with
  • makefile 中的 $< 和 $@ 是什么意思?

    I have a csv b csv 在我的docs csv目录中 我需要将每个文件转换为 json 文件 我遵循这个question https stackoverflow com questions 2706064 compile al
  • 以与文件大小相同的格式获取类或对象的大小?

    如何从内存中最好地确定类的大小 这是一个可以使用的基本示例类 请注意 这些变量除了用于示例之外没有其他用途 type TMyClass class public fString1 string fString2 string fIntege
  • ReactJS Mapbox-gl 无效类型:“容器”必须是字符串或 HTMLElement

    我正在使用 ReactJS 和 Mapbox GL JS 构建一个小型应用程序 const MapRender gt const mapContainerRef useRef null const map new mapboxgl Map
  • Android 库模块使用 proguard

    我想创建一个安全的库模块 没有人可以从 apk 文件中提取代码 但是当尝试在库 gradle 中启用 proguard 时 出现错误包不存在 然后我在 proguard 规则文件中添加以下行 keep class com alprocr k
  • 升级到v1.5时jquery ajax出错

    我从 v1 4 4 升级到 v1 5 我想我已经发现了下面的问题 document ready function Get token on page load update csrf token 该函数看起来像这样 EDITED funct
  • Dynamics CRM:在帐户实体中添加多个地址

    I have a scenario where I need to add multiple Address to Account I am using Dynamics 365 online instance and my current
  • 使用 REST API 进行正确的会话管理

    我已经完成了 RESTful API 的设计 其中我使用作为参数发送的 API 令牌对每个请求进行身份验证 现在我想创建一个客户端界面 我想知道什么是管理每个客户端的会话的正确安全方法browser客户 我想过一个流程来保持服务器端无状态
  • 这是可插拔组件本地化的好解决方案吗?

    我问了一个question https stackoverflow com questions 1504363 how should i localise pluggable components以前只有一个答案 我现在已经花了一些时间来研
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • 如何对 Django 视图进行单元测试?

    我想开始将单元测试集成到我的 Django 项目中 并且我发现对视图进行单元测试很棘手 因为 Django 使用函数实现视图的方式 例如 如果函数有 URL 则每个函数都是 Django 中的视图 页面 如何对 Django 视图进行单元测
  • 如何使用 hibernate JPA 2 以二进制形式存储 uuid

    我有一个关于通过休眠持久化 JPA2 在数据库中以二进制形式存储字符串uuid的问题 我现在正在使用这段代码 private UUID id Id Type type uuid char GeneratedValue generator s
  • 不小心删除了Android布局文件

    我不小心从我的 Android 项目中删除了一个布局文件 有什么办法可以拿回来吗 自从做完之后我就再也没碰过 而且我在其他地方没有该文件的副本 如果您的 bin 文件夹中有该 apk 那么您很幸运 使用apktool https code
  • 使用 ffmpeg 将视频与其自身连接,但相反

    我能够逆转 ffmpeg i input mp4 vf reverse output reversed mp4 我可以连接 ffmpeg i input mp4 i input mp4 filter complex 0 0 0 1 1 0
  • 如何以编程方式迭代所有 CMake 目标?

    有没有办法从顶层获取 CMake 项目的所有目标CMakeLists txt 即以编程方式迭代目标 我想要这样做的原因是将一些 XCode 特定设置应用于每个目标 if CMAKE GENERATOR MATCHES Xcode inclu
  • 受保护属性的通用 getter 和 setter

    考虑这个 TypeScript 类 它通过将实现分为超类和子类来提供类型检查的通用 getter 和 setter class ICompetence protected id number undefined protected name