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
