JavaScriptãã³ã¬ãŒã¿ãŒææ¡ã«ã€ããŠããã®æ§æããŠãŒã¹ã±ãŒã¹ãå©ç¹ããããŠçŸä»£ã®JavaScriptéçºãžã®æœåšçãªåœ±é¿ãæ·±ãæ¢æ±ããŸãã
JavaScriptãã³ã¬ãŒã¿ãŒææ¡ïŒã¡ãœããã®æ¡åŒµãšã¡ã¿ããŒã¿æ³šé
åçã§é²åãç¶ããèšèªã§ããJavaScriptã¯ãã³ãŒãã®å¯èªæ§ãä¿å®æ§ãæ¡åŒµæ§ãåäžãããæ¹æ³ãåžžã«æš¡çŽ¢ããŠããŸãããããã®åŽé¢ã«å¯ŸåŠããããšãç®çãšããæãæåŸ ãããŠããæ©èœã®äžã€ãããã³ã¬ãŒã¿ãŒææ¡ã§ãããã®èšäºã§ã¯ãJavaScriptãã³ã¬ãŒã¿ãŒã®å æ¬çãªæŠèŠãæäŸãããã®æ§æãæ©èœããããŠçŸä»£ã®JavaScriptéçºãžã®æœåšçãªåœ±é¿ãæ¢ããŸããçŸåšã¹ããŒãž3ã®ææ¡ã§ããããã³ã¬ãŒã¿ãŒã¯ãã§ã«Angularã®ãããªãã¬ãŒã ã¯ãŒã¯ã§åºã䜿çšãããŠãããBabelã®ãããªãã©ã³ã¹ãã€ã©ãä»ããŠã®æ¡çšãå¢ããŠããŸãããã®ããããã³ã¬ãŒã¿ãŒãçè§£ããããšã¯ãçŸä»£ã®JavaScriptéçºè ã«ãšã£ãŠäžå¯æ¬ ã§ãã
JavaScriptãã³ã¬ãŒã¿ãŒãšã¯ïŒ
ãã³ã¬ãŒã¿ãŒã¯ãPythonãJavaã®ãããªä»ã®èšèªããåçšããããã¶ã€ã³ãã¿ãŒã³ã§ããæ¬è³ªçã«ããããã¯ã¯ã©ã¹ãã¡ãœãããã¢ã¯ã»ãµãŒãããããã£ããŸãã¯ãã©ã¡ãŒã¿ã«æ·»ä»ã§ããç¹æ®ãªçš®é¡ã®å®£èšã§ãããã³ã¬ãŒã¿ãŒã¯ @expression
æ§æã䜿çšããŸããããã§ expression
ã¯ããã³ã¬ãŒãããã宣èšã«é¢ããæ
å ±ãšãšãã«å®è¡æã«åŒã³åºããã颿°ã«è©äŸ¡ãããªããã°ãªããŸããã
ãã³ã¬ãŒã¿ãŒããæ¢åã®ã³ãŒããçŽæ¥å€æŽããããšãªãã远å ã®æ©èœãã¡ã¿ããŒã¿ã远å ããæ¹æ³ãšèããŠãã ãããããã«ããããã宣èšçã§ä¿å®ããããã³ãŒãããŒã¹ãä¿é²ãããŸãã
åºæ¬çãªæ§æãšäœ¿çšæ³
åçŽãªãã³ã¬ãŒã¿ãŒã¯ãäœããã³ã¬ãŒããããã«å¿ããŠ1ã€ã2ã€ããŸãã¯3ã€ã®åŒæ°ãåã颿°ã§ãã
- ã¯ã©ã¹ãã³ã¬ãŒã¿ãŒã®å ŽåãåŒæ°ã¯ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã§ãã
- ã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒãã³ã¬ãŒã¿ãŒã®å ŽåãåŒæ°ã¯ã¿ãŒã²ãããªããžã§ã¯ãïŒã¯ã©ã¹ã®ãããã¿ã€ãããŸãã¯éçã¡ã³ããŒã®å Žåã¯ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ïŒãããããã£ããŒïŒã¡ãœãããŸãã¯ã¢ã¯ã»ãµãŒã®ååïŒãããã³ããããã£èšè¿°åã§ãã
- ããããã£ãã³ã¬ãŒã¿ãŒã®å ŽåãåŒæ°ã¯ã¿ãŒã²ãããªããžã§ã¯ããšããããã£ããŒã§ãã
- ãã©ã¡ãŒã¿ãã³ã¬ãŒã¿ãŒã®å ŽåãåŒæ°ã¯ã¿ãŒã²ãããªããžã§ã¯ããããããã£ããŒãããã³é¢æ°ã®ãã©ã¡ãŒã¿ãªã¹ãã«ããããã©ã¡ãŒã¿ã®ã€ã³ããã¯ã¹ã§ãã
ã¯ã©ã¹ãã³ã¬ãŒã¿ãŒ
ã¯ã©ã¹ãã³ã¬ãŒã¿ãŒã¯ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã«é©çšãããŸããã¯ã©ã¹å®çŸ©ãç£èŠã倿ŽããŸãã¯çœ®æããããã«äœ¿çšã§ããŸããäžè¬çãªãŠãŒã¹ã±ãŒã¹ã¯ããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªå ã§ã¯ã©ã¹ãç»é²ããããšã§ãã
äŸïŒã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹åã®ãã®ã³ã°
function logClass(constructor: Function) {
return class extends constructor {
constructor(...args: any[]) {
super(...args);
console.log(`New instance of ${constructor.name} created.`);
}
};
}
@logClass
class MyClass {
constructor(public message: string) {
}
}
const instance = new MyClass("Hello, Decorators!"); // Output: New instance of MyClass created.
ãã®äŸã§ã¯ãlogClass
ãã³ã¬ãŒã¿ãŒã¯MyClass
ã®ã³ã³ã¹ãã©ã¯ã¿ã倿Žããæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããã³ã«ã¡ãã»ãŒãžããã°ã«èšé²ããããã«ããŸãã
ã¡ãœãããã³ã¬ãŒã¿ãŒ
ã¡ãœãããã³ã¬ãŒã¿ãŒã¯ã¯ã©ã¹å ã®ã¡ãœããã«é©çšãããŸããã¡ãœããã®æ¯ãèããç£èŠã倿ŽããŸãã¯çœ®æããããã«äœ¿çšã§ããŸããããã¯ãã¡ãœããåŒã³åºãã®ãã®ã³ã°ãåŒæ°ã®æ€èšŒããŸãã¯ãã£ãã·ã³ã°ã®å®è£ ãªã©ã«äŸ¿å©ã§ãã
äŸïŒã¡ãœããåŒã³åºãã®ãã®ã³ã°
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calculator = new Calculator();
const sum = calculator.add(5, 3); // Output: Calling method add with arguments: [5,3]
// Output: Method add returned: 8
logMethod
ãã³ã¬ãŒã¿ãŒã¯ãadd
ã¡ãœããã®åŒæ°ãšæ»ãå€ããã°ã«èšé²ããŸãã
ã¢ã¯ã»ãµãŒãã³ã¬ãŒã¿ãŒ
ã¢ã¯ã»ãµãŒãã³ã¬ãŒã¿ãŒã¯ã¡ãœãããã³ã¬ãŒã¿ãŒã«äŒŒãŠããŸãããã²ãã¿ãŒãŸãã¯ã»ãã¿ãŒã¡ãœããã«é©çšãããŸããããããã£ãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããããæ€èšŒããžãã¯ã远å ãããããããã«äœ¿çšã§ããŸãã
äŸïŒã»ãã¿ãŒå€ã®æ€èšŒ
function validate(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalSet = descriptor.set;
descriptor.set = function (value: number) {
if (value < 0) {
throw new Error("Value must be non-negative.");
}
originalSet.call(this, value);
};
}
class Temperature {
private _celsius: number = 0;
@validate
set celsius(value: number) {
this._celsius = value;
}
get celsius(): number {
return this._celsius;
}
}
const temperature = new Temperature();
temperature.celsius = 25; // OK
// temperature.celsius = -10; // Throws an error
validate
ãã³ã¬ãŒã¿ãŒã¯ãcelsius
ã»ãã¿ãŒãéè² ã®å€ã®ã¿ãåãå
¥ããããšãä¿èšŒããŸãã
ããããã£ãã³ã¬ãŒã¿ãŒ
ããããã£ãã³ã¬ãŒã¿ãŒã¯ã¯ã©ã¹ã®ããããã£ã«é©çšãããŸããããããã£ã«é¢ããã¡ã¿ããŒã¿ãå®çŸ©ãããããã®åäœã倿Žãããããããã«äœ¿çšã§ããŸãã
äŸïŒå¿ é ããããã£ã®å®çŸ©
function required(target: any, propertyKey: string) {
let existingRequiredProperties: string[] = target.__requiredProperties__ || [];
existingRequiredProperties.push(propertyKey);
target.__requiredProperties__ = existingRequiredProperties;
}
class UserProfile {
@required
name: string;
age: number;
constructor(data: any) {
this.name = data.name;
this.age = data.age;
const requiredProperties: string[] = (this.constructor as any).prototype.__requiredProperties__ || [];
requiredProperties.forEach(property => {
if (!this[property]) {
throw new Error(`Missing required property: ${property}`);
}
});
}
}
// const user = new UserProfile({}); // Throws an error: Missing required property: name
const user = new UserProfile({ name: "John Doe" }); // OK
required
ãã³ã¬ãŒã¿ãŒã¯name
ããããã£ãå¿
é ãšããŠããŒã¯ããŸããã³ã³ã¹ãã©ã¯ã¿ã¯ãã®åŸããã¹ãŠã®å¿
é ããããã£ãååšãããã©ããããã§ãã¯ããŸãã
ãã©ã¡ãŒã¿ãã³ã¬ãŒã¿ãŒ
ãã©ã¡ãŒã¿ãã³ã¬ãŒã¿ãŒã¯é¢æ°ã®ãã©ã¡ãŒã¿ã«é©çšãããŸãããã©ã¡ãŒã¿ã«é¢ããã¡ã¿ããŒã¿ã远å ãããããã®åäœã倿Žãããããããã«äœ¿çšã§ããŸããä»ã®çš®é¡ã®ãã³ã¬ãŒã¿ãŒãããäžè¬çã§ã¯ãããŸããã
äŸïŒäŸåé¢ä¿ã®æ³šå ¥
import 'reflect-metadata';
const Injectable = (): ClassDecorator => {
return (target: any) => {
Reflect.defineMetadata('injectable', true, target);
};
};
const Inject = (token: any): ParameterDecorator => {
return (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => {
Reflect.defineMetadata('design:paramtypes', [token], target, propertyKey!)
};
};
@Injectable()
class DatabaseService {
connect() {
console.log("Connecting to the database...");
}
}
class UserService {
private databaseService: DatabaseService;
constructor(@Inject(DatabaseService) databaseService: DatabaseService) {
this.databaseService = databaseService;
}
getUser(id: number) {
this.databaseService.connect();
console.log(`Fetching user with ID: ${id}`);
}
}
const databaseService = new DatabaseService();
const userService = new UserService(databaseService);
userService.getUser(123);
ãã®äŸã§ã¯ãreflect-metadata
ïŒJavaScript/TypeScriptã§äŸåæ§æ³šå
¥ãæ±ãéã®äžè¬çãªææ³ïŒã䜿çšããŠããŸãã@Inject
ãã³ã¬ãŒã¿ãŒã¯ãUserServiceã®ã³ã³ã¹ãã©ã¯ã¿ã«DatabaseServiceã®ã€ã³ã¹ã¿ã³ã¹ã泚å
¥ããããã«æç€ºããŸããäžèšã®äŸã¯ãããªãèšå®ãªãã§ã¯å®å
šã«ã¯å®è¡ã§ããŸããããæå³ããã广ã瀺ããŠããŸãã
ãŠãŒã¹ã±ãŒã¹ãšå©ç¹
ãã³ã¬ãŒã¿ãŒã¯ããŸããŸãªå©ç¹ãæäŸãã倿§ãªãŠãŒã¹ã±ãŒã¹ã«é©çšã§ããŸãã
- ã¡ã¿ããŒã¿æ³šéïŒ ãã³ã¬ãŒã¿ãŒã䜿çšããŠãã¯ã©ã¹ãã¡ãœãããããããã£ã«ã¡ã¿ããŒã¿ãæ·»ä»ã§ããŸãããã®ã¡ã¿ããŒã¿ã¯ããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãäŸåæ§æ³šå ¥ãã«ãŒãã£ã³ã°ãæ€èšŒãªã©ã®è¿œå æ©èœãæäŸããããã«äœ¿çšã§ããŸãã
- ã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ïŒAOPïŒïŒ ãã³ã¬ãŒã¿ãŒã¯ãã¡ãœããã远å ã®æ¯ãèãã§ã©ããããããšã«ããããã®ã³ã°ãã»ãã¥ãªãã£ããã©ã³ã¶ã¯ã·ã§ã³ç®¡çãªã©ã®AOPã®æŠå¿µãå®è£ ã§ããŸãã
- ã³ãŒãã®åå©çšæ§ïŒ ãã³ã¬ãŒã¿ãŒã¯ãå ±éã®æ©èœãåå©çšå¯èœãªãã³ã¬ãŒã¿ãŒã«æœåºã§ããããã«ããããšã§ãã³ãŒãã®åå©çšæ§ãä¿é²ããŸãã
- å¯èªæ§ã®åäžïŒ ãã³ã¬ãŒã¿ãŒã¯ãé¢å¿äºãåé¢ããå®åçãªã³ãŒããåæžããããšã§ãã³ãŒããããèªã¿ãããã宣èšçã«ããŸãã
- ãã¬ãŒã ã¯ãŒã¯ãšã®çµ±åïŒ ãã³ã¬ãŒã¿ãŒã¯ãAngularãNestJSãMobXãªã©ã®äººæ°ã®ããJavaScriptãã¬ãŒã ã¯ãŒã¯ã§åºã䜿çšãããŠãããã³ã³ããŒãã³ãããµãŒãã¹ããã®ä»ã®ãã¬ãŒã ã¯ãŒã¯åºæã®æŠå¿µããã宣èšçã§è¡šçŸåè±ãã«å®çŸ©ããæ¹æ³ãæäŸããŸãã
å®äžçã®äŸãšåœéçãªèæ ®äºé
ãã³ã¬ãŒã¿ãŒã®ã³ã¢ã³ã³ã»ããã¯ç°ãªãããã°ã©ãã³ã°ã³ã³ããã¹ãéã§åãã§ããããã®é©ç𿹿³ã¯äœ¿çšãããç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã«ãã£ãŠç°ãªãå ŽåããããŸãã以äžã«ããã€ãã®äŸãæããŸãã
- AngularïŒGoogleã«ãã£ãŠéçºãããäžççã«äœ¿çšãããŠããŸãïŒïŒ Angularã¯ãã³ã³ããŒãã³ãããµãŒãã¹ããã£ã¬ã¯ãã£ããå®çŸ©ããããã«ãã³ã¬ãŒã¿ãŒãå€çšããŠããŸããäŸãã°ã
@Component
ãã³ã¬ãŒã¿ãŒã¯ããã³ãã¬ãŒããã¹ã¿ã€ã«ããã®ä»ã®ã¡ã¿ããŒã¿ãæã€UIã³ã³ããŒãã³ããå®çŸ©ããããã«äœ¿çšãããŸããããã«ããã倿§ãªããã¯ã°ã©ãŠã³ããæã€éçºè ãæšæºåãããã¢ãããŒãã䜿çšããŠè€éãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãç°¡åã«äœæããã³ç®¡çã§ããŸãã@Component({ selector: 'app-my-component', templateUrl: './my-component.html', styleUrls: ['./my-component.css'] }) class MyComponent { // Component logic here }
- NestJSïŒAngularã«è§ŠçºãããNode.jsãã¬ãŒã ã¯ãŒã¯ã§ãäžççã«æ¡çšãããŠããŸãïŒïŒ NestJSã¯ãã³ã³ãããŒã©ãŒãã«ãŒããã¢ãžã¥ãŒã«ãå®çŸ©ããããã«ãã³ã¬ãŒã¿ãŒã䜿çšããŸãã
@Controller
ããã³@Get
ãã³ã¬ãŒã¿ãŒã¯ãAPIãšã³ããã€ã³ããšããã«å¯Ÿå¿ãããã³ãã©ãå®çŸ©ããããã«äœ¿çšãããŸããããã«ãããéçºè ã®å°ççãªå Žæã«é¢ä¿ãªããã¹ã±ãŒã©ãã«ã§ä¿å®ãããããµãŒããŒãµã€ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ããã»ã¹ãç°¡çŽ åãããŸãã@Controller('users') class UsersController { @Get() findAll(): string { return 'This action returns all users'; } }
- MobXïŒç¶æ
管çã©ã€ãã©ãªã§ãReactã¢ããªã±ãŒã·ã§ã³ã§äžççã«åºã䜿çšãããŠããŸãïŒïŒ MobXã¯ãç£èŠå¯èœãªããããã£ãšèšç®å€ãå®çŸ©ããããã«ãã³ã¬ãŒã¿ãŒã䜿çšããŸãã
@observable
ããã³@computed
ãã³ã¬ãŒã¿ãŒã¯ãããŒã¿ã®å€æŽãèªåçã«è¿œè·¡ããUIãé©å®æŽæ°ããŸããããã«ãããéçºè ã¯åœéçãªãªãŒãã£ãšã³ã¹åãã«ã¬ã¹ãã³ã·ãã§å¹ççãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããè€éãªããŒã¿ãããŒããã£ãŠãã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒã§ããŸããclass Store { @observable count = 0; @computed get doubledCount() { return this.count * 2; } increment() { this.count++; } }
åœéåã«é¢ããèæ ®äºé ïŒ ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã察象ãšãããããžã§ã¯ãã§ãã³ã¬ãŒã¿ãŒã䜿çšããå ŽåãåœéåïŒi18nïŒãšå°ååïŒl10nïŒãèæ ®ããããšãéèŠã§ãããã³ã¬ãŒã¿ãŒèªäœã¯i18n/l10nãçŽæ¥åŠçããŸãããã以äžã®æ¹æ³ã§ãã®ããã»ã¹ã匷åããããã«äœ¿çšã§ããŸãã
- 翻蚳ã®ããã®ã¡ã¿ããŒã¿ã®è¿œå ïŒ ãã³ã¬ãŒã¿ãŒã䜿çšããŠã翻蚳ãå¿ èŠãªããããã£ãã¡ãœãããããŒã¯ã§ããŸãããã®ã¡ã¿ããŒã¿ã¯ãi18nã©ã€ãã©ãªãé¢é£ããããã¹ããæœåºããŠç¿»èš³ããããã«äœ¿çšã§ããŸãã
- 翻蚳ã®åçèªã¿èŸŒã¿ïŒ ãã³ã¬ãŒã¿ãŒã䜿çšããŠããŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠç¿»èš³ãåçã«èªã¿èŸŒãããšãã§ããŸããããã«ããããŠãŒã¶ãŒã®å Žæã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã®åžæããèšèªã§è¡šç€ºãããããã«ãªããŸãã
- æ¥ä»ãšæ°å€ã®ãã©ãŒãããïŒ ãã³ã¬ãŒã¿ãŒã䜿çšããŠããŠãŒã¶ãŒã®ãã±ãŒã«ã«åŸã£ãŠæ¥ä»ãšæ°å€ããã©ãŒãããã§ããŸããããã«ãããæ¥ä»ãšæ°å€ãæåçã«é©åãªåœ¢åŒã§è¡šç€ºãããããã«ãªããŸãã
äŸãã°ãããããã£ã翻蚳ãå¿
èŠãšããŠããŒã¯ãã@Translatable
ãã³ã¬ãŒã¿ãŒãæ³åããŠã¿ãŠãã ãããi18nã©ã€ãã©ãªã¯ã³ãŒãããŒã¹ãã¹ãã£ã³ãã@Translatable
ã§ããŒã¯ããããã¹ãŠã®ããããã£ãèŠã€ãã翻蚳ã®ããã«ããã¹ããæœåºã§ããŸãã翻蚳åŸãã©ã€ãã©ãªã¯ãŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠå
ã®ããã¹ãã翻蚳çã«çœ®ãæããããšãã§ããŸãããã®ã¢ãããŒãã¯ãç¹ã«å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠãããæŽçãããä¿å®ããããi18n/l10nã¯ãŒã¯ãããŒãä¿é²ããŸãã
ææ¡ã®çŸç¶ãšãã©ãŠã¶ã®ãµããŒã
JavaScriptãã³ã¬ãŒã¿ãŒææ¡ã¯ãçŸåšTC39ã®æšæºåããã»ã¹ã§ã¹ããŒãž3ã«ãããŸããããã¯ãææ¡ãæ¯èŒçã«å®å®ããŠãããå°æ¥ã®ECMAScript仿§ã«å«ãŸããå¯èœæ§ãé«ãããšãæå³ããŸãã
ãã³ã¬ãŒã¿ãŒã®ãã€ãã£ããã©ãŠã¶ãµããŒãã¯ãŸã éå®çã§ãããBabelãTypeScriptã³ã³ãã€ã©ã®ãããªãã©ã³ã¹ãã€ã©ã䜿çšããããšã§ãã»ãšãã©ã®çŸä»£ã®JavaScriptãããžã§ã¯ãã§äœ¿çšã§ããŸãããããã®ããŒã«ã¯ããã³ã¬ãŒã¿ãŒæ§æãã©ã®ãã©ãŠã¶ãNode.jsç°å¢ã§ãå®è¡ã§ããæšæºã®JavaScriptã³ãŒãã«å€æããŸãã
Babelã®äœ¿çšïŒ Babelã§ãã³ã¬ãŒã¿ãŒã䜿çšããã«ã¯ã@babel/plugin-proposal-decorators
ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããBabelã®èšå®ãã¡ã€ã«ïŒ.babelrc
ãŸãã¯babel.config.js
ïŒã§èšå®ããå¿
èŠããããŸãããŸãããããã@babel/plugin-proposal-class-properties
ãå¿
èŠã«ãªãã§ãããã
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }]
],
};
TypeScriptã®äœ¿çšïŒ TypeScriptã«ã¯ãã³ã¬ãŒã¿ãŒã®çµã¿èŸŒã¿ãµããŒãããããŸããtsconfig.json
ãã¡ã€ã«ã§experimentalDecorators
ã³ã³ãã€ã©ãªãã·ã§ã³ãæå¹ã«ããå¿
èŠããããŸãã
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"experimentalDecorators": true,
"emitDecoratorMetadata": true, // Optional, but useful for dependency injection
}
}
emitDecoratorMetadata
ãªãã·ã§ã³ã«æ³šæããŠãã ãããããã¯reflect-metadata
ã®ãããªã©ã€ãã©ãªãšé£æºãããã³ã¬ãŒã¿ãŒãä»ããäŸåæ§æ³šå
¥ãå¯èœã«ããŸãã
æœåšçãªåœ±é¿ãšå°æ¥ã®æ¹åæ§
JavaScriptãã³ã¬ãŒã¿ãŒææ¡ã¯ãç§ãã¡ãJavaScriptã³ãŒããæžãæ¹æ³ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããã¯ã©ã¹ãã¡ãœãããããããã£ã«æ©èœã远å ããããã®ãã宣èšçã§è¡šçŸåè±ããªæ¹æ³ãæäŸããããšã§ããã³ã¬ãŒã¿ãŒã¯ã³ãŒãã®å¯èªæ§ãä¿å®æ§ãåå©çšæ§ãåäžãããããšãã§ããŸãã
ææ¡ãæšæºåããã»ã¹ãçµãŠãããåºãæ¡çšãããã«ã€ããŠãããçŽæçã§åŒ·åãªéçºè äœéšãæäŸããããã«ãã³ã¬ãŒã¿ãŒãæ¡çšãããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãå¢ããããšãæåŸ ãããŸãã
ããã«ããã³ã¬ãŒã¿ãŒã®ã¡ã¿ããŒã¿æ©èœã¯ãããŒãªã³ã°ãã³ãŒãåæã®ããã®æ°ããªå¯èœæ§ãå¯èœã«ããŸããäŸãã°ããªã³ã¿ãŒãã³ãŒããšãã£ã¿ã¯ãã³ã¬ãŒã¿ãŒã®ã¡ã¿ããŒã¿ã䜿çšããŠãããæ£ç¢ºã§é¢é£æ§ã®é«ãææ¡ããšã©ãŒã¡ãã»ãŒãžãæäŸã§ããŸãã
çµè«
JavaScriptãã³ã¬ãŒã¿ãŒã¯ãçŸä»£ã®JavaScriptéçºãå€§å¹ ã«åŒ·åã§ãã匷åã§ææãªæ©èœã§ãããã®æ§æãæ©èœãæœåšçãªãŠãŒã¹ã±ãŒã¹ãçè§£ããããšã§ãéçºè ã¯ãã³ã¬ãŒã¿ãŒã掻çšããŠãããä¿å®ãããããèªã¿ããããåå©çšå¯èœãªã³ãŒããæžãããšãã§ããŸãããã€ãã£ããã©ãŠã¶ã®ãµããŒãã¯ãŸã é²åäžã§ãããBabelãTypeScriptã®ãããªãã©ã³ã¹ãã€ã©ã«ããã仿¥ã®ã»ãšãã©ã®JavaScriptãããžã§ã¯ãã§ãã³ã¬ãŒã¿ãŒã䜿çšããããšãå¯èœã§ããææ¡ãæšæºåã«åããŠé²ã¿ãããåºãæ¡çšãããã«ã€ããŠããã³ã¬ãŒã¿ãŒã¯JavaScriptéçºè ã®æŠåšåº«ã«ãããŠäžå¯æ¬ ãªããŒã«ã«ãªãã§ãããã