From 74b27eeb7143db27a470347ffbad5fe0e0b2a2eb Mon Sep 17 00:00:00 2001 From: Alexander O'Mara Date: Wed, 20 Nov 2024 00:30:32 -0500 Subject: [PATCH] Added a private and protected example --- README.md | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1202ebd..567471a 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ exampleBE.beta = 0xBCDE; console.assert(data.join(', ') === '171, 205, 188, 222'); ``` -## Extending +## Extending / Inheritance Structures can be extended with new child members. @@ -114,3 +114,45 @@ varFloat.type = 0xF; varFloat.value = 3.1415; console.assert(data.join(', ') === '15, 0, 0, 0, 86, 14, 73, 64'); ``` + +## Private / Protected + +Members can be made `private` or `protected` but type checking must be relaxed. + +Casting the name to `never` or `any` will pass the type checker. + +```ts +import { memberU8, Struct } from '@hqtsm/struct'; + +export class Example extends Struct { + declare public readonly ['constructor']: typeof Example; + + declare private alpha: number; + + declare protected beta: number; + + declare public gamma: number; + + public setAlpha(value: number): void { + this.alpha = value; + } + + public setBeta(value: number): void { + this.beta = value; + } + + public static override readonly BYTE_LENGTH: number = ((o) => { + o += memberU8(this, 'alpha' as never, o); + o += memberU8(this, 'beta' as never, o); + o += memberU8(this, 'gamma', o); + return o; + })(super.BYTE_LENGTH); +} + +const data = new Uint8Array(Example.BYTE_LENGTH); +const example = new Example(data.buffer); +example.setAlpha(65); +example.setBeta(66); +example.gamma = 71; +console.assert(data.join(', ') === '65, 66, 71'); +```