diff --git a/package.json b/package.json index 15028861..8608bead 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "prepack": "./scripts/prepack.sh", "test": "yarn test:source && yarn test:types", "test:source": "jest && jest-it-up", - "test:types": "tsd", + "test:types": "tsd --files 'src/**/*.test-d.ts'", "test:watch": "jest --watch" }, "resolutions": { diff --git a/src/versions.test-d.ts b/src/versions.test-d.ts new file mode 100644 index 00000000..d30ed0e8 --- /dev/null +++ b/src/versions.test-d.ts @@ -0,0 +1,27 @@ +import { expectAssignable, expectNotAssignable } from 'tsd'; + +import type { SemVerRange, SemVerVersion } from '.'; +import { assertIsSemVerRange, assertIsSemVerVersion } from '.'; + +// A value produced via a type's own assertion function is assignable to +// itself: + +const unsafeVersion = '1.0.0'; +assertIsSemVerVersion(unsafeVersion); +expectAssignable(unsafeVersion); + +const unsafeRange = '^1.0.0'; +assertIsSemVerRange(unsafeRange); +expectAssignable(unsafeRange); + +// SemVerVersion and SemVerRange are distinct opaque types, and are not +// mutually assignable, even though both are strings at runtime: + +expectNotAssignable(unsafeVersion); +expectNotAssignable(unsafeRange); + +// A plain string is not assignable to either opaque type without going +// through the type's own validation/assertion function: + +expectNotAssignable('1.0.0'); +expectNotAssignable('^1.0.0');