Skip to content

Member type/type alias inside a class (or also an interface)Β #57150

Closed as not planned
@yw662

Description

@yw662

πŸ” Search Terms

member type, type alias, generic

βœ… Viability Checklist

⭐ Suggestion

When implementing a generic class with typescript, some types with very long type parameter list may be reused very frequently, eg:

class SomeGenericClass<A, B, C, D, E, F, G> {
    member1: SomeMember<A, B, C, D>
    member2: SomeMember<A, B, C, D>
    constructor(arg: SomeMember<A, B, C, D>) {
        this.member1 = arg
        this.member2 = arg
    }
}

It would be nice if those types can be aliased somewhere. This type alias could not be outside the class or the type parameter would be lost:

type Member = SomeMember<A, B, C, D>

class SomeGenericClass<A, B, C, D, E, F, G> {
    member: Member // Wrong: Member is not SomeMember<A, B, C, D>
    ...
    }
}

Or it could be:

class SomeGenericClass<A, B, C, D, E, F, G, Member extends SomeMember<A, B, C, D> = SomeMember<A, B, C, D>> {
...
}

However it is not good: the type parameter Member is not exactly SomeMember<A, B, C, D>, so you cannot use an instance of SomeMember<A, B, C, D> for Member, esp. if it is overwritten by the user.

It should work nicely if it is declared inside the class:

class SomeGenericClass<A, B, C, D, E, F, G> {
    type Member = SomeMember<A, B, C, D>
    // or: type Member: SomeMember<A, B, C, D>
    member1: Member
    member2: Member
    // or even in the constructor (which may prevent type inferencing, but let's see)
    constructor(arg: Member) {
        this.member1 = arg
        this.member2 = arg
    }
}

It may also be used outside the class:

...
type Foo = SomeGenericClass<A, B, C, D, E, F, G>.Member // which equals SomeMember<A, B, C, D>
// or
const someInstance = new SomeGenericClass(arg);
type Foo2 = (typeof someInstance).Member

πŸ“ƒ Motivating Example

To simplify and clarify complex generic classes.

πŸ’» Use Cases

  1. What do you want to use this for?
    In complex generic classes.
  2. What shortcomings exist with current approaches?
    Have to repeat myself again and again.
  3. What workarounds are you using in the meantime?
    By repeating myself.

Metadata

Metadata

Assignees

No one assigned

    Labels

    DuplicateAn existing issue was already created

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions