admin管理员组文章数量:1405564
I'm trying to make a pluggable function, based on this.
export type PropertyDescriptorValue = (PropertyDescriptor & ThisType<unknown>)['value'];
export type PropertyConfig<K extends PropertyKey> = { [p in K]: PropertyDescriptorValue };
export function defineProperty<T, K extends PropertyKey>(
o: T,
p: K,
attributes: PropertyDescriptor & ThisType<unknown>,
): asserts o is T & PropertyConfig<K> {
Object.defineProperty<T>(o, p, attributes);
}
export const mylib = () => {};
defineProperty(mylib, 'teste', {
writable: false,
value(a: number, b: number) {
return a + b;
},
})
console.info("a:", mylib.teste(1, 1)) // 2
The code above works properly, but I'm thinking of something more like this:
export type PropertyDescriptorValue = (PropertyDescriptor & ThisType<unknown>)['value'];
export type PropertyConfig<K extends PropertyKey> = { [p in K]: PropertyDescriptorValue };
export function register<T>(o: T) {
return <K extends PropertyKey>(
p: K,
attributes: PropertyDescriptor & ThisType<unknown>,
): asserts o is T & PropertyConfig<K> => { // but, how may I assert this `o` here?
Object.defineProperty<T>(o, p, attributes);
}
}
export const mylib = () => {};
mylib.register = register(mylib)
mylib.register('teste', {
writable: false,
value(a: number, b: number) {
return a + b;
},
})
console.info("a:", mylib.teste(1, 1)) // 2
Is it possible to infer new methods? I think it is, but I'm not sure anymore.
I'm trying to make a pluggable function, based on this.
export type PropertyDescriptorValue = (PropertyDescriptor & ThisType<unknown>)['value'];
export type PropertyConfig<K extends PropertyKey> = { [p in K]: PropertyDescriptorValue };
export function defineProperty<T, K extends PropertyKey>(
o: T,
p: K,
attributes: PropertyDescriptor & ThisType<unknown>,
): asserts o is T & PropertyConfig<K> {
Object.defineProperty<T>(o, p, attributes);
}
export const mylib = () => {};
defineProperty(mylib, 'teste', {
writable: false,
value(a: number, b: number) {
return a + b;
},
})
console.info("a:", mylib.teste(1, 1)) // 2
The code above works properly, but I'm thinking of something more like this:
export type PropertyDescriptorValue = (PropertyDescriptor & ThisType<unknown>)['value'];
export type PropertyConfig<K extends PropertyKey> = { [p in K]: PropertyDescriptorValue };
export function register<T>(o: T) {
return <K extends PropertyKey>(
p: K,
attributes: PropertyDescriptor & ThisType<unknown>,
): asserts o is T & PropertyConfig<K> => { // but, how may I assert this `o` here?
Object.defineProperty<T>(o, p, attributes);
}
}
export const mylib = () => {};
mylib.register = register(mylib)
mylib.register('teste', {
writable: false,
value(a: number, b: number) {
return a + b;
},
})
console.info("a:", mylib.teste(1, 1)) // 2
Is it possible to infer new methods? I think it is, but I'm not sure anymore.
Share edited Mar 8 at 0:38 Adrian Miranda asked Mar 7 at 21:58 Adrian MirandaAdrian Miranda 3384 silver badges13 bronze badges 3 |1 Answer
Reset to default 2You can use asserts
keyword to assert presence of new properties, but assertion requires explicit annotation so there's some small boiler plating. I guess it could be optimized, but you have an idea:
Playground
function register<T extends object>(obj: T){
function register<K extends PropertyKey, T extends {}, P extends PropertyDescriptor>(
this: T,
p: K,
attributes: P,
): asserts this is T & { [p in K]: P['value']}{
Object.defineProperty<T>(this, p, attributes);
}
return Object.assign(obj, {register}) as T & {register: typeof register}
}
type WithRegister<T extends object> = ReturnType<typeof register<T>>;
const base = () => {};
const mylib: WithRegister<typeof base> = register(base);
mylib.register('teste', {
writable: false,
value(a: number, b: number) {
return a + b;
},
})
console.info("a:", mylib.teste(1, 1)) // (property) teste: (a: number, b: number) => number
本文标签: typescriptInfer new propertiesStack Overflow
版权声明:本文标题:typescript - Infer new properties - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744908581a2631773.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
defineProperty
?). Please edit so we can copy and paste into our own IDEs and immediately get to work on it without having to fix things to get to the starting line. – jcalz Commented Mar 7 at 22:31