-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Suggestion: Type assertion operator (!) with mapped types #13253
Comments
this requires subtraction types #4183 |
Not sure i see why this requires subtraction types.. |
If declare function safe<T>(o: Partial<T>): T;
var a: { b?: string, a?: number } = {};
var x = safe(a); // {b:string, a: number}; you could even add support for type PartialOrNullable<T> = {
[P in keyof T]?: T[P] | undefined | null;
};
declare function safe<T>(o: PartialOrNullable<T>): T;
var a: { b?: string, a: number | null };
var x = safe(a); // {b:string, a:number} with #12596 implemented, you can even allow dotting off unknown properties if you add a string indexer to the output: declare function safe<T>(o: PartialOrNullable<T>): T & {[x:string]: any};
var x = safe(a);
x.unkown // allowed with 12596, and its type would be any; for the recursive version of it, #12769 tracks fixing it. In general |
Thanks @mhegazy for a great reply. I realize that it's a truly useful and powerful concept to stop thinking of type parameters as "the input type", and more like "the common denominator between inputs/outputs". Reminds me of Type used in Angular to denote the "type of the constructor". Maybe worth adding something similar to the documentation around Partial? |
@mhegazy Can this be done without declaring and implementing a function? If I have a partial type |
This should be doable now with |
TypeScript Version: 2.1.1
Also relates to #12424
I recently spent some time looking at the discussion on a safe navigation
?.
operator in typescript/javascript (see #16, and https://esdiscuss.org/topic/existential-operator-null-propagation-operator). Then it struck me that ES6 proxies could be a solution that didn't require new language operators. Wrote something working together, and also found this existing npm package: https://www.npmjs.com/package/safe-proxy. In summary, you'd be able to writeNow, how do I type annotate this? At first, I thought maybe the new mapped types in Typescript 2.1 could be used, but then I've come to believe that it isn't possible currently (please let me know how to do this otherwise). What I miss is a generalized way of narrowing optional types under
---strictNullChecks
.For example, let's consider using the
mapObject
from the the Typescript 2.1 release wiki writeup, with optional properties:This results in a TS2345 error (basically
bar
can't be optional)Now, back to the
SafeProxy
type. The best I can come up with today is...which is marginally better than just
any
.I would want (and need for my example above) to define something like below. NOTE: the assertion operator here is made-up-syntax. I suggested an exclamation mark after the actual type, but this could obviously be debated.
Interestingly it would kind of enable the reverse of
Partial<T>
:Side note: As I intend the
SafeProxy
class to implementSymbol.toPrimitive
, no trailing__value
or similar would be needed. This seems to play well with typescript primitives thoughSome other usages (that I guess all play pretty well with
--strictNullChecks
)The text was updated successfully, but these errors were encountered: