admin管理员组

文章数量:1295255

I can get a type representing class members like this:

    class ClassWithFields {
        public instanceMember: {a: string, b: number};
        public secondInstanceMember: {q: "q"};
        public static staticMember: {c: string, d: Date};
    }
    type getClassFieldType<TClass, TKey extends keyof TClass> = TClass[TKey];
    type getClassFieldFields<TClass, TKey extends keyof TClass> = keyof TClass[TKey];
    
    /**
     * Resolves to:
     *      const testClassFieldType: {
     *           q: "q";
     *      }
     * IDE suggests following things for second template arg: instanceMember, secondInstanceMember
     */
    const testClassFieldType: getClassFieldType<ClassWithFields, "secondInstanceMember">;

    /**
     * Resolves to:
     *     const testGetClassFieldFields: "a" | "b"
     */
    const testGetClassFieldFields: getClassFieldFields<ClassWithFields, "instanceMember">;

I want the same, specifically the list of fields, in a static field. That is I want a type that given ClassWithFields and "staticMember", should resolve to key list containing "c"|"d".

I can get a type representing class members like this:

    class ClassWithFields {
        public instanceMember: {a: string, b: number};
        public secondInstanceMember: {q: "q"};
        public static staticMember: {c: string, d: Date};
    }
    type getClassFieldType<TClass, TKey extends keyof TClass> = TClass[TKey];
    type getClassFieldFields<TClass, TKey extends keyof TClass> = keyof TClass[TKey];
    
    /**
     * Resolves to:
     *      const testClassFieldType: {
     *           q: "q";
     *      }
     * IDE suggests following things for second template arg: instanceMember, secondInstanceMember
     */
    const testClassFieldType: getClassFieldType<ClassWithFields, "secondInstanceMember">;

    /**
     * Resolves to:
     *     const testGetClassFieldFields: "a" | "b"
     */
    const testGetClassFieldFields: getClassFieldFields<ClassWithFields, "instanceMember">;

I want the same, specifically the list of fields, in a static field. That is I want a type that given ClassWithFields and "staticMember", should resolve to key list containing "c"|"d".

Share Improve this question asked Feb 12 at 11:36 Tomáš ZatoTomáš Zato 53.3k63 gold badges310 silver badges825 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 2

To refer to a class itself (not its instance), use typeof:

Playground

    class ClassWithFields {
        declare public instanceMember: {a: string, b: number};
        declare public secondInstanceMember: {q: "q"};
        public static staticMember: {c: string, d: Date};
    }
    type getClassFieldType<TClass, TKey extends keyof TClass> = TClass[TKey];
    type getClassFieldFields<TClass, TKey extends keyof TClass> = keyof TClass[TKey];
    
    
    declare const testGetClassFieldFields: getClassFieldFields<typeof ClassWithFields, "staticMember">;

本文标签: javascriptHow to refer to static field in mapped types in TypeScriptStack Overflow