TypeScript-refleksjon for grensesnitt


Finnes det en måte å finne ut om en egenskap i et grensesnitt er definert som skrivebeskyttet? Si,

interface ITest {
    readonly foo: number;
}

Er det nå en slags refleksjon eller list for TypeScript for å få denne informasjonen? F.eks. noe som:

let info = Reflect.get(ITest, 'foo');

if (info.isReadOnly()) { ... }

Svar #1

Det finnes nå: https://typescript-rtti.org/.

import { reflect } from 'typescript-rtti';

interface ITest {
    readonly foo: number;
}

let iface = reflect<ITest>().as('interface').reflectedInterface;
let info = iface.getProperty('foo').type;

expect(info.isReadonly).to.be.true;

Ansvarsfraskrivelse: Jeg er forfatteren

Svar #2

Siden TypeScript-grensesnitt ikke eksisterer ved kjøring, kan du ikke bruke refleksjon på dem. For å bruke refleksjon opprettet jeg en klasse som implementerer grensesnittet og reflekterte på klassen. Jeg klarte imidlertid ikke å vite om en egenskap er readonly. Usikker på om dette skyldes mangel på forståelse fra min side, eller en feil. Her er hva jeg prøvde:

Kode

interface ITest {
  readonly foo: number;
  bar: number;
}
class TestImplementation implements ITest {
  readonly foo: number = 1;
  bar: number = 2;
}
function reflectOnTest() {
  var testImplementation = new TestImplementation();
  var properties: string[] = Object.getOwnPropertyNames(testImplementation);
  var fooDescriptor = Object.getOwnPropertyDescriptor(testImplementation, properties[0]);
  var barDescriptor = Object.getOwnPropertyDescriptor(testImplementation, properties[1]);
  console.log("foo writable = " + fooDescriptor.writable);
  console.log("bar writable = " + barDescriptor.writable);
}

Resultatet er:

foo skrivbar=sann

bar writable=true

Relaterte artikler