In case you don't know what RighFminal typing
Typescript is a structural typing language, but it is possible to mimic the behavior of nominal typi...
For further actions, you may consider blocking this person and/or reporting abuse
Does not look like a proper solution:
not sure i understand this
let t2: Test = {}is expected becausexis supposed to be not existDo this instead:
Symbols are enumerable by default but
Object.keysandfor-inwork only withstringprops.So it fixes all the above issues.
If you also want to prevent
Object.assigncopies, add this:no, dont mess with the runtime
the purspose is to hide the type while making it an nominal type, the result of your original example is actually correct and is expected
Have you looked at zod brand?
github.com/colinhacks/zod#brand
I think zod brand is a very smart solution
but it has 2 problems
cat[BRAND]cat[BRAND]and value ofcat[BRAND]mismatched1 is unsatisfying but overall is not a problem, because nobody is going to do that
2 is an easy fix, just add optional modifier, although it still mislead some to believe it may return
{ Cat: true }overall I think zod solution is practically perfect
update:
I missed one point:
to assign Cat type to a variable, you either do
since we want to avoid type assertion if possible
then we are left with:
which is slightly unintuitive
ideally, we want
but this will error using zod method because it is missing symbol properties
In general TypeScript requires a runtime assertion in the absence of a compile time type assertion.
Playground
You can even do this to primitive types
Assertion Functions
Source
A type predicate can be used to a similar end.
In a sense the fact that
even works is no better than
avoid type assertion because it is prone to error
playground
You've missed the point.
Typescript's assignability has edge cases that may surprise some people, perhaps the most infamous one is that assignments are not subject to excess property checks.
So it could be argued:
Compare that to
playground