Is it possible to infer the type of a private member in a generic way?
Having this class:
class Dummy {
private num: number; // I want to get the type of this: number
str: string; // control group
}
I can get the type of the num
field manually:
type DummyNumTypeWorks = Dummy['num']; // number -- yey, I'm happy.
But I want to do this with generics. I have the following examples that DON'T WORK. And I understand why: Dummy
does not implement { num: number }
, it does not have a public num
member. So I'm searching for alternatives.
// Inferring from Dummy
type DummyMemberType<TMember extends string> = Dummy extends { [key in TMember]: infer R } ? R : never;
type DummyStrMember = DummyMemberType<'str'>; // string
type DummyNumMember = DummyMemberType<'num'>; // never :(
// Inferring from the member name
type DummyMemberType2<TMember extends string> = TMember extends keyof Dummy ? Dummy[TMember] : never;
type DummyStrMember2 = DummyMemberType2<'str'>; // string
type DummyNumMember2 = DummyMemberType2<'num'>; // never :(
I understand why these DON'T work.
My question: while I can infer the type of num
manually, is there a way to do this in a generic way (with more metaprogramming)?
Background: I want to create fancy decorators that give guarantees on some other members besides the one being decorated. And some of these members might be private.