Comme @cartant l'a suggéré, vous pouvez utiliser surcharges en TypeScript. Ils ont une seule implémentation mais plusieurs signatures. Vous pouvez lire le manuel à ce sujet pour voir comment faire en sorte que les signatures et l'implémentation fonctionnent bien ensemble. Dans votre cas, vous pouvez faire quelque chose comme ceci :
export class ConstantImpl<T> {
// guessing at your constructor
public constructor(public val: T) {
}
public static create(b: boolean): Constant<boolean>;
public static create(i: number): Constant<number>;
public static create(v: boolean | number): Constant<boolean | number> {
return new ConstantImpl(v);
}
}
Cela permettra seulement ConstantImpl.create()
d'accepter un boolean
ou un number
et il rejettera tout le reste. Notez que je n'ai pas eu besoin d'inspecter le type de v
pour voir si c'est un boolean
ou un number
et je n'ai pas eu à spécifier manuellement la valeur de l'option T
dans l'appel à la ConstantImpl<T>
car le constructeur déduit la valeur de T
à partir de l'argument que vous passez.
Et vraiment, dans ce cas, je me demande pourquoi vous vous souciez de restreindre ConstantImpl.create()
d'accepter uniquement boolean
y number
valeurs. Pourquoi ne pas opter plutôt pour la voie générique complète ?
// accept any type
public static create<T>(v: T): Constant<T> {
return new ConstantImpl(v);
}
J'espère que cela vous aidera ; bonne chance.