-
Notifications
You must be signed in to change notification settings - Fork 12.5k
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
Add typed return for Object.defineProperties #41424
Comments
Yours won’t correctly handle non‑ interface ObjectConstructor {
defineProperty<
T,
P extends PropertyKey,
V = P extends keyof T ? T[P] : unknown,
W = P extends keyof T ? true : false
>(
target: T,
property: P,
descriptor: TypedPropertyDescriptor<V> & { readonly writable?: W },
): (T &
{ readonly [K in P as W extends false ? K : never]: V } &
{ -readonly [K in P as W extends true ? K : never]: V })
// Needs https://github.com/microsoft/TypeScript/issues/40562:
// & (asserts target is T &
// { readonly [K in P as W extends false ? K : never]: V } &
// { -readonly [K in P as W extends true ? K : never]: V });
defineProperties<
T,
M extends Record<string | symbol, PropertyDescriptor>
>(
target: T,
properties: M & ThisType<T>,
): ({} extends M ? T : T & {
readonly [K in keyof M as M[K] extends { readonly writable: false } ? K : (K extends keyof T ? never : K)]:
M[K] extends Readonly<TypedPropertyDescriptor<infer V>> ? V : any;
} & {
-readonly [K in keyof M as M[K] extends { readonly writable: true } ? K : (K extends keyof T ? K : never)]:
M[K] extends Readonly<TypedPropertyDescriptor<infer V>> ? V : any;
})
// Needs https://github.com/microsoft/TypeScript/issues/40562:
// & (asserts target is ({} extends M ? T : T & {
// readonly [K in keyof M as M[K] extends { readonly writable: false } ? K : (K extends keyof T ? never : K)]:
// M[K] extends Readonly<TypedPropertyDescriptor<infer V>> ? V : any;
// } & {
// -readonly [K in keyof M as M[K] extends { readonly writable: true } ? K : (K extends keyof T ? K : never)]:
// M[K] extends Readonly<TypedPropertyDescriptor<infer V>> ? V : any;
// }))
} |
Ah, I didn't see |
@clshortfuse Which is probably the same reason as to why |
PR #42424 seems to be a start towards addressing this. |
@ExE-Boss Your definition seems far more useful. Perhaps it would make sense to turn into a PR? Is #40562 essential? Adding proper definitions of |
Search Terms
Object.defineProperties
typed
Suggestion
const newObject = Object.defineProperties(o, map);
Use Cases
Creating extensions of certain properties while still being able to type-check them
Examples
Checklist
My suggestion meets these guidelines:
The current type I'm using is the following:
It seems alright but I would love to get some feedback. Currently, I'm targeting against
.get()
first, then.set(arg0)
and finally.value
.See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
The text was updated successfully, but these errors were encountered: