簡體   English   中英

Typescript反映公共/私人

[英]Typescript reflect public / private

我有一個假設的 class

class Test {
  @isThisPublic() public test1?: any;
  @isThisPublic() public test2?: any;
}

現在,在@isThisPublic()裝飾器中,我想根據它是否是公共 class 字段來做不同的事情。 有沒有辦法做到這一點?

謝謝!

TypeScript使用emitDecoratorMetadata編譯器選項發出其他元數據, emitDecoratorMetadata選項可用於元數據提議的 reflect-metadata emitDecoratorMetadata

正如提案所述,可以為屬性類型,方法參數和方法返回值類型發出設計時元數據。

可見性不在發出的元數據中,因此在運行時它不適用於裝飾成員。

由於可見性和裝飾器都是由開發人員指定的,因此@isThisPublic()裝飾器不會帶來太多好處,因為開發人員可以指定相應的裝飾器(無論它們用於什么):

class Test {
  @Public test1?: any;
  @Private private test2?: any;
}

正如他在回答中提到的那樣,在編譯器中沒有對此的支持。

添加指定字段的公共/私有性質的裝飾器是一個不錯的選擇,但是團隊中總有可能開發人員可能不知道裝飾的需要而忘記添加它,甚至裝飾器和修飾語可能會分歧(是的,它們彼此相鄰,但有時候人們會忽略它們),這可能會導致錯誤。

我們可以以類型安全的方式自己添加此信息的一種方法是使用keyof僅返回類的公共字段的事實。 使用這個我們可以構建一個函數,該函數只接受具有該類的公共字段的對象。 然后,編譯器將強制執行此函數的參數必須包含所有公共字段且僅包含公共字段,並且任何其他字段都將引發錯誤。

function isPublicMetadata<T>(publicFields: Record<keyof T, true>){
    return publicFields;
}

const publicTestFields = isPublicMetadata<Test>({
    test1: true
    // test2 : true // this is an error
})

class Test {
    test1?: any;
    private test2?: any;
}

我的項目https://typescript-rtti.org/使這成為可能。

import { reflect } from 'typescript-rtti';

class Test {
  public test1?: any;
  private test2?: any;
  protected test3?: any;
}

expect(reflect(Test).getMethod('test1').isPublic).to.be.true;
expect(reflect(Test).getMethod('test2').isPrivate).to.be.true;
expect(reflect(Test).getMethod('test3').isProtected).to.be.true;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM