classTypeを使う側はどのようなコードになることを想定していますか?
もし__typename
みたいなものとして使いたいのであれば、classのインスタンスはinstanceof
があるのでどうかなと思いましたが。。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof
typescriptにて、クラスによって異なる引数を取るといったコードを記述したいです。
言語化するのが少し難しいので、コードを先に提示します。
// 各クラスの実装省略
abstract class BaseClass {}
class Custom1class extends BaseClass {}
class Custom2class extends BaseClass {}
class Custom3class extends BaseClass {}
abstract class CustomUseBaseClass<T extends BaseClass> {
readonly classType: unknown; // ここの型を指定したい
abstract main(instance: T): void;
}
上記のように、BaseClass
を拡張したいくつかのカスタムクラスがあります。
それらのクラスを使用するクラスとして、ベースでCustomUseBaseClass
があります。
ここから新たなクラスCustomUse1Class
を作成するとして、このクラスのmain
関数は引数としてcustom1class
のインスタンスを使用したいです。
実装としてはおおよそ以下の形になります。
class CustomUse1Class extends CustomUseBaseClass<custom1class> {
readonly classType: 'custom1class' = 'custom1class'; // 表題の箇所の具体例
main(instance: custom1class) {
// 略
}
}
このように、main
の引数はcustom1class
を取ります。
ここで、CustomUse1Class
が、引数としてcustom1class
を取る、ということを見分ける1ために、classType
として文字列のcustom1class
を入れようと思いました。
ここからが本題です。
上記のコードのように、T
にそのまま与えられた文字列をリテラル型として扱う手段はありますか?
requireで動的読み込みを考えているため、型推論が一度anyを通ります。そのため、見分けるためのものが必要になりました。 ↩
classTypeを使う側はどのようなコードになることを想定していますか?
もし__typename
みたいなものとして使いたいのであれば、classのインスタンスはinstanceof
があるのでどうかなと思いましたが。。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof
@yuu_1st
Questioner質問のタイトルとだいぶかけ離れてしまうのですが…
この実装で参考になるでしょうか?
TypeScript: TS Playground - An online editor for exploring TypeScript and JavaScript
上記の例では、BaseUseClassの配列をもとに、CustomClass1と2にフィルターする機能を実装しています。
もしご質問の意図と違いましたら、CustomUseBaseClassやCustomUse1Classを使って何をしたいか(クラス実装に求める要件)を明確にしていただけると回答できるかもしれません。。。
@yuu_1st
Questioner@yuu_1st
Questioner