TypeScriptのdecorator
使用するためには、tsconfigでexperimentalDecoratorsを指定する必要がある
docs
2017/7に書かれた和訳
#WIP
https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-rc/#decorators
TypeScript v5.0
ECMAScriptのdecoratorが入った
https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-rc/#differences-with-experimental-legacy-decorators
experimentalDecoratorsとの違い
emitDecoratorMetadataと互換性がない
https://qiita.com/printf_moriken/items/b081f50b30d73275c801
仕様の変遷
decoratorの評価順
種類
class decorator
method decorator
accessor decorator
property decorator
paramerter decorator
Decorator Factory
decoratorは通常の高階関数として定義できる
逆に言えば、ただの関数宣言だけ見れば、それがdecoratorして使用される関数なのかどうかは判断できないmrsekut.icon
このように定義すると、
code:ts
function color(value: string) {
return function (target) {
// ..
};
}
こう使える
code:ts
class C {
@color()
method() {..}
}
これ、常に必要になるわけじゃないんかmrsekut.icon
class decoratorとかでは不要っぽい
ユースケース
ログ出力
https://qiita.com/taqm/items/4bfd26dfa1f9610128bc#実践1-ログ出力
確かにコレ良さそうmrsekut.icon
method内に直接ログを書くんじゃなくて、decoratorを付与してログを出力できる
method内は、そのmethodに関する処理だけに集中できる
引数のvalidaiton
notEmptyStringかとか、Intかなどのvalidationができる
https://qiita.com/taqm/items/4bfd26dfa1f9610128bc#実践2-引数のチェック
DI
InversifyJSがやってる
https://qiita.com/taqm/items/4bfd26dfa1f9610128bc#実践4-依存関係の注入di
#??
classにしか使えないの?関数に対しては使えないの?なんで?
https://qiita.com/taqm/items/4bfd26dfa1f9610128bc
tscofig
emitDecoratorMetadata
experimentalDecorators