File tree Expand file tree Collapse file tree 5 files changed +83
-0
lines changed
examples/required-options Expand file tree Collapse file tree 5 files changed +83
-0
lines changed Original file line number Diff line number Diff line change 1+ # required options Example
2+
3+ ` Base ` has no required options by default, so the following code has no type errors.
4+
5+ ``` js
6+ import { Base } from " javascript-plugin-architecture-with-typescript-definitions" ;
7+
8+ const base1 = new Base ();
9+ const base2 = new Base ({});
10+ ```
11+
12+ But required options can be added by extending the ` Base.Optiions ` interface.
13+
14+ ``` ts
15+ declare module " javascript-plugin-architecture-with-typescript-definitions" {
16+ namespace Base {
17+ interface Options {
18+ myRequiredUserOption: string ;
19+ }
20+ }
21+ }
22+ ```
23+
24+ With that extension, the same code will have type a type error
25+
26+ ``` ts
27+ // TS Error: Property 'myRequiredUserOption' is missing in type '{}' but required in type 'Options'
28+ const base = new Base ({});
29+ ```
Original file line number Diff line number Diff line change 1+ import { Base } from "../../index.js" ;
2+ export { Base } from "../../index.js" ;
3+
4+ declare module "../.." {
5+ namespace Base {
6+ interface Options {
7+ myRequiredUserOption : string ;
8+ }
9+ }
10+ }
11+
12+ export class MyBase extends Base { }
Original file line number Diff line number Diff line change 1+ import { Base } from "../../index.js" ;
2+
3+ /**
4+ * @param {Base } base
5+ * @param {Base.Options } options
6+ */
7+ function pluginRequiringOption ( base , options ) {
8+ if ( ! options . myRequiredUserOption ) {
9+ throw new Error ( 'Required option "myRequiredUserOption" missing' ) ;
10+ }
11+ }
12+
13+ export const MyBase = Base . plugin ( pluginRequiringOption ) ;
Original file line number Diff line number Diff line change 1+ import { MyBase } from "./index.js" ;
2+
3+ // @ts -expect-error - An argument for 'options' was not provided
4+ new MyBase ( ) ;
5+
6+ // @ts -expect-error - Type '{}' is missing the following properties from type 'Options': myRequiredUserOption
7+ new MyBase ( { } ) ;
8+
9+ new MyBase ( {
10+ myRequiredUserOption : "" ,
11+ } ) ;
Original file line number Diff line number Diff line change 1+ import { test } from "uvu" ;
2+ import * as assert from "uvu/assert" ;
3+
4+ import { MyBase } from "./index.js" ;
5+
6+ test ( "new MyBase()" , ( ) => {
7+ assert . throws ( ( ) => new MyBase ( ) ) ;
8+ } ) ;
9+
10+ test ( "new MyBase({})" , ( ) => {
11+ assert . throws ( ( ) => new MyBase ( { } ) ) ;
12+ } ) ;
13+
14+ test ( 'new MyBase({ myRequiredUserOption: ""})' , ( ) => {
15+ assert . not . throws ( ( ) => new MyBase ( { myRequiredUserOption : "" } ) ) ;
16+ } ) ;
17+
18+ test . run ( ) ;
You can’t perform that action at this time.
0 commit comments