Last active
August 12, 2025 11:03
-
-
Save pesterhazy/444e51b4b52a06661c8402ff9ee4959c to your computer and use it in GitHub Desktop.
Revisions
-
pesterhazy revised this gist
Aug 12, 2025 . No changes.There are no files selected for viewing
-
pesterhazy revised this gist
Aug 7, 2025 . 1 changed file with 5 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -26,3 +26,8 @@ test.only("experiment 2", async () => { experiment = new Experiment(); experiment.foo({}); // oops, we called foo without passing bar, causing a runtime error }); /* How do I change the code so that I can be sure that every class that implements IExperiment is safe to use with through the interface? */ -
pesterhazy revised this gist
Aug 7, 2025 . 1 changed file with 5 additions and 2 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -6,9 +6,12 @@ interface IExperiment { } class Experiment implements IExperiment { // Wat?! // Why is Experiment allowed to implement IExperiment (the typechecker doesn't complain) // even though IExperiment.foo doesn't guarantee that opts.bar is defined? foo(opts: { bar: string }): void { // foo needs opts.bar to be there assert.ok(opts.bar); } } -
pesterhazy created this gist
Aug 7, 2025 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,25 @@ import test from "node:test"; import assert from "node:assert"; interface IExperiment { foo(opts: {}): void; } class Experiment implements IExperiment { // Why does Experiment implement IExperiment, even though IExperiment.foo doesn't // guarantee that opts.bar is defined? foo(opts: { bar: string }): void { assert.ok(opts.bar); } } test.only("experiment", async () => { const experiment = new Experiment(); experiment.foo({ bar: "baz" }); }); test.only("experiment 2", async () => { let experiment: IExperiment; experiment = new Experiment(); experiment.foo({}); // oops, we called foo without passing bar, causing a runtime error });