Spring Bootã®æ®åããéæ³ã®ãããã§ãã·ã³ãã«ãªJavaãµãŒãã¹ã®éçºãšå±éã¯ç°¡åã§ããããããéããã¯ã©ã¹ããã¹ãããããŒã¿ã倿ããå¿ èŠãããããããã«ããŒãã³ã³ããŒã¿ãŒãåæã³ã³ã¹ãã©ã¯ã¿ãŒãããã³ã·ãªã¢ã©ã€ã¶ãŒã¯ã³ãŒãã«è±å¯ã«ãããå žåçãªJavaå°çãžã®éãéããŸããããããæ°æ©èœã®éçºãé ããããšãå€ãçç±ã§ãããããŠãã¯ããã³ãŒãçæã¯æ©èœããŸãããããŸãæè»ã§ã¯ãããŸããã
TypeScriptã¯ãããã¯ãšã³ãéçºè ã®éã§ãŸã ååã«ç¢ºç«ãããŠããŸããããããããJavaScriptã«å ¥åã远å ããããã®å®£èšãã¡ã€ã«ã®ã»ãããšããŠç¥ãããŠããããã§ããããããããã§ãã衚çŸããã®ã«æ°åè¡ã®Javaãå¿ èŠãšããTypeScriptã®ã»ãã®æ°è¡ã§è¡šçŸã§ããããžãã¯ããããããããŸãã
TypeScriptã®å žåçãªæ©èœãšèšãããæ©èœã®å€ãã¯ãå®éã«ã¯JavaScriptãåç §ããŠããŸãããã ããTypeScriptã¯ãJavaScriptãšæ§æäžããã³æŠå¿µäžã®é¡äŒŒç¹ããããç¬èªã®èšèªãšèŠãªãããšãã§ããŸããããã§ã¯ãJavaScriptããå°ãé¢ããŠãTypeScriptèªäœãèŠãŠã¿ãŸããããããã¯ãéåžžã«åŒ·åã§ãããªããæè»ãªåã·ã¹ãã ã倧éã®æ§æäžã®ç ç³ããããŠæåŸã«nullã®å®å šæ§ãåããçŸããèšèªã§ããããã€ãã®è¿œå ã®èª¬æãšãšãã«ãã«ã¹ã¿ã ãã«ãã®Node / TypeScriptWebã¢ããªã±ãŒã·ã§ã³ã䜿çš
ããŠGithubã§ãªããžããªããã¹ãããŸãããã¿ããã®ã®ã¢ãŒããã¯ãã£ã®äŸãå«ãé«åºŠãªãã©ã³ãããããŸã ãããŠãããéèŠãªã¿ã€ãã³ã°ã®æŠå¿µã
TypeScriptã®ç޹ä»
åºæ¬ããå§ããŸããããTypeScriptã¯éåæã®æ©èœããã°ã©ãã³ã°èšèªã§ãããã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ãããã³ãããªãã¯ããã©ã€ããŒããä¿è·ããã屿§ããµããŒãããŸãããããã£ãŠããã®èšèªã§äœæ¥ããå Žåãããã°ã©ããŒã¯ãã€ã¯ãã¢ãŒããã¯ãã£ãŒãšã³ãŒãã¹ã¿ã€ã«ã®ã¬ãã«ã§äœæ¥ããéã«ããªãã®æè»æ§ãåŸãããšãã§ããŸããTypeScriptã³ã³ãã€ã©ã¯åçã«æ§æã§ããŸããã€ãŸããèš±å¯ãããã€ã³ããŒãã®ã¿ã€ãã颿°ã«æç€ºçãªæ»ãã¿ã€ããå¿ èŠãªå Žåãããã³ã³ã³ãã€ã«æã«ãŒããã§ãã¯ãæå¹ã«ãããã©ãããå¶åŸ¡ã§ããŸãã
TypeScriptã¯éåžžã®JavaScriptã«ã³ã³ãã€ã«ããããããNode.jsãããã¯ãšã³ãã©ã³ã¿ã€ã ãšããŠäœ¿çšãããŸããSpringã«äŒŒãå æ¬çãªãã¬ãŒã ã¯ãŒã¯ããªãå Žåãäžè¬çãªWebãµãŒãã¹ã¯ãWebãµãŒããŒãšããŠæ©èœããããæè»ãªãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãïŒExpress.jsã¯ãã®è¯ãäŸã§ãïŒããã®çµæããéæ³ããå°ãªããªããåºæ¬çãªèšå®ãšæ§æãããæç¢ºã«é 眮ãããŸãããã®å Žåãæ¯èŒçè€éãªãµãŒãã¹ã§ããæ§æãããã«èª¿æŽããå¿ èŠããããŸããäžæ¹ãæ¯èŒçå°ããªã¢ããªã±ãŒã·ã§ã³ãã»ããã¢ããããããšã¯é£ãããããŸãããããã«ãæåã«ãã¬ãŒã ã¯ãŒã¯ãåŠç¿ããªããŠããã»ãšãã©å®è¡å¯èœã§ãã
Nodeã®æè»ã§åŒ·åãªããã±ãŒãžãããŒãžã£ãŒnpmã䜿çšãããšãäŸåé¢ä¿ã®ç®¡çãç°¡åã«ãªããŸãã
åºç€
ã¯ã©ã¹ãå®çŸ©ãããš
publicãã¢ã¯ã»ã¹å¶åŸ¡ä¿®é£ŸåããµããŒããããprotectedãããŠprivateãããŸãã»ãšãã©ã®éçºè
ã«ç¥ãããŠããŸãïŒ
class Order {
private status: OrderStatus;
constructor(public readonly id: string, isSpecialOrder: boolean) {
[...]
}
}
ãã®ã¯ã©ã¹ã«ã¯
Orderããã©ã€ããŒãstatusãã£ãŒã«ããšidèªã¿åãå°çšãããªãã¯ãã£ãŒã«ãã®2ã€ã®å±æ§ããããŸããTypeScriptã§ã¯ãããŒã¯ãŒããå«ãã³ã³ã¹ãã©ã¯ã¿ãŒåŒæ°publicãprotectedãŸãã¯privateèªåçã«ã¯ã©ã¹å±æ§ã«ãªããŸãã
interface User {
id?: string;
name: string;
t_registered: Date;
}
const user: User = { name: 'Bob', t_registered: new Date() };
TypeScriptã¯åæšè«ã䜿çšãããããã¯ã©ã¹
UserèªäœãæäŸãããŠããªãå Žåã§ããUserãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åã§ããããšã«æ³šæããŠãã ããããã®æ§é ã®ãããªã¢ãããŒãã¯ãçŽç²ãªããŒã¿ãšã³ãã£ãã£ãæäœãããšãã«ããéžæãããã¡ãœãããå
éšç¶æ
ãå¿
èŠãšããŸããã
ãžã§ããªãã¯ã¯ãJavaãšã»ãŒåãæ¹æ³ã§TypeScriptã§è¡šçŸãããŸãã
class Repository<T extends StoredEntity> {
findOneById(id: string): T {
[...]
}
}
ãã¯ãã«ã¿ã€ãã·ã¹ãã
TypeScriptã®åŒ·åãªåã·ã¹ãã ã®äžå¿ã¯åæšè«ã§ããéçåä»ãããµããŒãããŠããŸãããã ããæ»ãã¿ã€ããŸãã¯ãã©ã¡ãŒã¿ãŒã®ã¿ã€ããã³ã³ããã¹ãããæšæž¬ã§ããå Žåãéçã¿ã€ãã®æ³šéã¯ãªãã·ã§ã³ã§ãã
TypeScriptã§ã¯ããŠããªã³ã¿ã€ããéšåã¿ã€ããããã³ã¿ã€ãã®å ±ééšåã䜿çšããããšãã§ããŸããããã«ãããäžå¿ èŠãªè€éããåé¿ããªãããèšèªã«ããªãã®æè»æ§ãäžããããŸããTypeScriptã§ã¯ãç¹å®ã®å€ãåãšããŠäœ¿çšããããšãã§ããŸããããã¯ãããŸããŸãªç¶æ³ã§éåžžã«åœ¹ç«ã¡ãŸãã
åæåãåæšè«ãããã³ãŠããªã³å
泚æã¹ããŒã¿ã¹ãïŒåæãšããŠïŒã¿ã€ãã»ãŒããªè¡šçŸãæã€å¿ èŠãããããJSONã·ãªã¢ã«åã®ããã®æåå衚çŸãå¿ èŠãšããäžè¬çãªç¶æ³ãèããŠã¿ãŸãã Javaã§ã¯ãããã¯æååå€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšã²ãã¿ãŒãšãšãã«åæåã«ãªããŸãã
æåã®äŸã§ã¯ãTypeScriptåæã«ãããæåå衚çŸãçŽæ¥è¿œå ã§ããŸããããã«ãããé¢é£ä»ããããæåå衚çŸãèªåçã«ã·ãªã¢ã«åããã¿ã€ãã»ãŒããªåæè¡šçŸãæ®ããŸãã
enum Status {
ORDER_RECEIVED = 'order_received',
PAYMENT_RECEIVED = 'payment_received',
DELIVERED = 'delivered',
}
interface Order {
status: Status;
}
const order: Order = { status: Status.ORDER_RECEIVED };
ã³ãŒãã®æåŸã®è¡ã«æ³šç®ããŠãã ãããããã§ã¯ãåæšè«ã«ãããã€ã³ã¿ãŒãã§ã€ã¹ã«äžèŽãããªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åã§ããŸã
`Order`ãå
éšç¶æ
ãããžãã¯ãé çªã«äžŠã¹ãå¿
èŠããªããããã¯ã©ã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒãªãã§å®è¡ã§ããŸãã
確ãã«ãã¿ã€ããšãŠããªã³ã¿ã€ãã®æšè«ãçžäºã«å ±æããããšã§ããã®ã¿ã¹ã¯ãããã«ç°¡åã«è§£æ±ºã§ããããšãããããŸããã
interface Order {
status: 'order_received' | 'payment_received' | 'delivered';
}
const orderA: Order = { status: 'order_received' }; //
const orderB: Order = { status: 'new' }; //
TypeScriptã³ã³ãã€ã©ã¯ãæå¹ãªæ³šæã¹ããŒã¿ã¹ãšããŠæäŸãããæååã®ã¿ãåãå ¥ããŸãïŒããã«ã¯ãåä¿¡JSONããŒã¿ã®æ€èšŒãåŒãç¶ãå¿ èŠã§ããããšã«æ³šæããŠãã ããïŒã
åºæ¬çã«ããã®ãããªå衚çŸã¯äœã§ãæ©èœããŸããã¿ã€ãã¯ãæååãªãã©ã«ãæ°å€ãããã³ãã®ä»ã®ã«ã¹ã¿ã ã¿ã€ããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®åéåã§ããå¯èœæ§ããããŸããããã«è峿·±ãäŸã«ã€ããŠã¯ãTypeScriptã®é«åºŠãªå ¥åã¬ã€ããåç §ããŠãã ããã
ã©ã ããšæ©èœçè°è«
TypeScriptã¯æ©èœçãªããã°ã©ãã³ã°èšèªã§ãããããã©ã ããšãåŒã°ããå¿å颿°ãã³ã¢ã§ãµããŒãããŠããŸãã
const evenNumbers = [ 1, 2, 3, 4, 5, 6 ].filter(i => i % 2 == 0);
äžèšã®äŸ
.filter()ã¯ãã¿ã€ãã®é¢æ°ãåããŸã(a: T) => booleanããã®é¢æ°ã¯ãå¿åã®ã©ã ãã§è¡šããi => i % 2 == 0ãŸããæ©èœãã©ã¡ãŒã¿ã«æç€ºçã«æå®ãããã¿ã€ããæ©èœã€ã³ã¿ãŒãã§ã€ã¹ãå¿
èŠãªJavaãšã¯ç°ãªããã©ã ãã¿ã€ãã¯å¿åã§è¡šãããšãã§ããŸãã
class OrderService {
constructor(callback: (order: Order) => void) {
[...]
}
}
éåæããã°ã©ãã³ã°
TypeScriptã¯ããã¹ãŠã®æ³šæç¹ããããŸãããJavaScriptã®ã¹ãŒããŒã»ããã§ãããããéåæããã°ã©ãã³ã°ã¯ãã®èšèªã®éèŠãªæŠå¿µã§ããã¯ããããã§ã©ã ããšã³ãŒã«ããã¯ã䜿çšã§ããŸããTypeScriptã«ã¯ãã³ãŒã«ããã¯ã®å°çãåé¿ããã®ã«åœ¹ç«ã€2ã€ã®äž»èŠãªã¡ã«ããºã ããããŸããpromiseãšãããããã¿ãŒã³
async/awaitã§ããçŽæã¯æ¬è³ªçã«ãåŸã§ç¹å®ã®å€ãè¿ãããšãçŽæããå³æã®æ»ãå€ã§ãã
// ,
function fetchUserProfiles(url: string): Promise<UserProfile[]> {
[...]
}
//
function getActiveProfiles(): Promise<UserProfile[]> {
return fetchUserProfiles(URL)
.then(profiles => profiles.filter(profile => profile.active))
.catch(error => handleError(error));
}
åœä»€
.then()ã¯ä»»æã®æ°ã§é£éã§ãããããå Žåã«ãã£ãŠã¯ãäžèšã®ãã¿ãŒã³ã«ãã£ãŠã³ãŒããããªãæ··ä¹±ããå¯èœæ§ããããŸãã颿°asyncã宣èšawaitããpromiseã解決ããã®ãåŸ
ã£ãŠããéã«ããã䜿çšããããšã«ããããããšåãã³ãŒããã¯ããã«åæçãªã¹ã¿ã€ã«ã§æžãããšãã§ããŸãããã®å Žåããããç¥ãããæŒç®åã䜿çšããæ©äŒãéãããŸãtry/catchã
// async/await ( , fetchUserProfiles )
async function getActiveProfiles(): Promise<UserProfile[]> {
const allProfiles = await fetchUserProfiles(URL);
return allProfiles.filter(profile => profile.active);
}
// try/catch
async function getActiveProfilesSafe(): Promise<UserProfile[]> {
try {
const allProfiles = await fetchUserProfiles(URL);
return allProfiles.filter(profile => profile.active);
} catch (error) {
handleError(error);
return [];
}
}
äžèšã®ã³ãŒãã¯åæããŠããããã«èŠããŸããã衚瀺ãããã ãã§ããããšã«æ³šæããŠãã ããïŒå¥ã®promiseãããã«è¿ãããããïŒã
ãšã¯ã¹ãã³ã·ã§ã³ãªãã¬ãŒã¿ãŒãšã¬ã¹ããªãã¬ãŒã¿ãŒïŒããªãã®çæŽ»ãæ¥œã«ããŸã
Javaã䜿çšããå Žåããªããžã§ã¯ãã®ããŒã¿æäœãæ§ç¯ãããŒãžãããã³åè§£ã«ãããã¹ãã¬ãªã¿ã€ãåãããã³ãŒãã倧éã«çæãããããšããããããŸããã¯ã©ã¹ãå®çŸ©ããã³ã³ã¹ãã©ã¯ã¿ãŒãã²ãã¿ãŒãã»ãã¿ãŒãçæãããªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããå¿ èŠããããŸãããã¹ãã±ãŒã¹ã§ã¯ãã¯ããŒãºãã¯ã©ã¹ã®ã¢ãã¯ã€ã³ã¹ã¿ã³ã¹ã«ã€ããŠã®èå¯ã«ç©æ¥µçã«é Œãå¿ èŠãããããšããããããŸãã
TypeScriptã§ã¯ãããããã¹ãŠããã¿ã€ãã»ãŒããªæ§æã·ã¥ã¬ãŒã§ããspreadæŒç®åãšrestæŒç®åã䜿çšããŠç°¡åã«åŠçã§ããŸãã
ãŸããé åæ¡åŒµæŒç®å...ã䜿çšããŠé åãè§£åããŸãã
const a = [ 'a', 'b', 'c' ];
const b = [ 'd', 'e' ];
const result = [ ...a, ...b, 'f' ];
console.log(result);
// >> [ 'a', 'b', 'c', 'd', 'e', f' ]
ãã¡ãã䟿å©ã§ãããå®éã®TypeScriptã¯ããªããžã§ã¯ãã§ãåãããšãã§ããããšã«æ°ä»ãããšãã«å§ãŸããŸãã
interface UserProfile {
userId: string;
name: string;
email: string;
lastUpdated?: Date;
}
interface UserProfileUpdate {
name?: string;
email?: string;
}
const userProfile: UserProfile = { userId: 'abc', name: 'Bob', email: 'bob@example.com' };
const update: UserProfileUpdate = { email: 'bob@example.com' };
const updated: UserProfile = { ...userProfile, ...update, lastUpdated: new Date() };
console.log(updated);
// >> { userId: 'abc', name: 'Bob', email: 'bob@example.com', lastUpdated: 2019-12-19T16:09:45.174Z}
ããã§äœãèµ·ãã£ãŠããããèããŠãã ãããåºæ¬çã«ããªããžã§ã¯ã
updatedã¯äžæ¬åŒ§ã³ã³ã¹ãã©ã¯ã¿ã䜿çšããŠäœæãããŸãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒå
ã§ãåãã©ã¡ãŒã¿ãŒã¯å®éã«ã¯å·Šããéå§ããŠæ°ãããªããžã§ã¯ããäœæããŸãã
ãããã£ãŠãæ¡åŒµãªããžã§ã¯ãã䜿çšãã
userProfileãŸã;圌ãæåã«ããããšã¯èªåèªèº«ãã³ããŒããããšã§ãã 2çªç®ã®ã¹ãããã§ã¯ãæ¡åŒµãªããžã§ã¯ããupdateããã«ããŒãžãããæåã®ãªããžã§ã¯ãã«åå²ãåœãŠãããŸããããããŸããæ°ãããªããžã§ã¯ããäœæããŸããæåŸã®ã¹ãããã§ããã£ãŒã«ããããŒãžãããŠåå²ãåœãŠããlastUpdatedãæ°ãããªããžã§ã¯ããäœæããããã®çµæãæçµçãªãªããžã§ã¯ããäœæãããŸãã
ã¹ãã¬ããæŒç®åã䜿çšããŠäžå€ãªããžã§ã¯ãã®ã³ããŒãäœæããããšã¯ãããŒã¿ãåŠçããããã®éåžžã«å®å šã§é«éãªæ¹æ³ã§ããæ³šïŒspreadæŒç®åã¯ããªããžã§ã¯ãã®æµ ãã³ããŒãäœæããŸããæ·±ããè€æ°ã®èŠçŽ ã¯ããªã³ã¯ãšããŠã³ããŒãããŸãã
æ¡åŒµæŒç®åã«ã¯ããªããžã§ã¯ãã¬ã¹ããšåŒã°ããåçã®ãã¹ãã©ã¯ã¿ããããŸãã
const userProfile: UserProfile = { userId: 'abc', name: 'Bob', email: 'bob@example.com' };
const { userId, ...details } = userProfile;
console.log(userId);
console.log(details);
// >> 'abc'
// >> { name: 'Bob', email: 'bob@example.com' }
ä»ããã座ã£ãŠãäžèšã®ãããªæäœãå®è¡ããããã«Javaã§èšè¿°ããªããã°ãªããªããã¹ãŠã®ã³ãŒããæ³åãããšãã§ãã
çµè«ãé·æãšçæã«ã€ããŠå°ã
ããã©ãŒãã³ã¹
TypeScriptã¯æ¬è³ªçã«éåæã§ãããå®è¡æç°å¢ãé«éã§ãããããNode / TypeScriptãµãŒãã¹ãJavaãµãŒãã¹ãšç«¶åããå¯èœæ§ãããã·ããªãªã¯æ°å€ããããŸãããã®ã¹ã¿ãã¯ã¯ãI / Oæäœã«ç¹ã«é©ããŠãããæ°ãããããã¡ã€ã«ç»åã®ãµã€ãºå€æŽãªã©ããšãã©ãçãããããã³ã°æäœã§ããŸãæ©èœããŸãããã ãããµãŒãã¹ã®äž»ãªç®çãCPUã§æ·±å»ãªèšç®ãè¡ãããšã§ããå ŽåãNodeãšTypeScriptã¯ããããããã«ã¯ããŸãé©ããŠããŸããã
çªå·ã¿ã€ã
TypeScriptã§äœ¿çšãããã¿ã€ãã
numberãæŽæ°å€ãšæµ®åå°æ°ç¹å€ãåºå¥ããªããããå€ãã®èŠæãæ®ãããŠããŸããå®è·µã«ããã°ãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã¯ãŸã£ããåé¡ããããŸããããã ããéè¡å£åº§ããã§ãã¯ã¢ãŠããµãŒãã¹çšã®ã¢ããªãäœæããŠããå Žåã¯ãTypeScriptã䜿çšããªãããšããå§ãããŸãã
ãšã³ã·ã¹ãã
Node.jsã®äººæ°ãèãããšã仿¥ãæ°åäžã®ããã±ãŒãžãããã®ã¯åœç¶ã®ããšã§ããããããNodeã¯Javaãããè¥ããããå€ãã®ããã±ãŒãžã¯å€ãã®ããŒãžã§ã³ãçãå»¶ã³ãŠããããäžéšã®ã©ã€ãã©ãªã®ã³ãŒãã®åè³ªã¯æããã«å£ã£ãŠããŸãã
ãšããããæäœã«éåžžã«äŸ¿å©ãªããã€ãã®é«å質ã®ã©ã€ãã©ãªã«ã€ããŠèšåãã䟡å€ããããŸããããšãã°ãWebãµãŒããŒãäŸåé¢ä¿ã®æ¿å ¥ãã³ã³ãããŒã©ãŒã®æ³šéãªã©ã§ãããã ãããµãŒãã¹ã倿°ã®ååã«ãµããŒããããŠãããµãŒãããŒãã£ããã°ã©ã ã«å€§ããäŸåããå Žåã¯ãPythonãJavaããŸãã¯Clojureã䜿çšããããšããå§ãããŸãã
æ©èœéçºã®å é
äžã§èŠãããã«ãTypeScriptã®æãéèŠãªå©ç¹ã®1ã€ã¯ããã®èšèªã§è€éãªããžãã¯ãæŠå¿µãããã³æäœãç°¡åã«è¡šçŸã§ããããšã§ããJSONããã®èšèªã®äžå¯æ¬ ãªéšåã§ããã仿¥ãããŒã¿è»¢éã®ããŒã¿ã·ãªã¢ã«å圢åŒãšããŠåºã䜿çšãããŠãããããã¥ã¡ã³ãæåã®ããŒã¿ããŒã¹ã§åäœãããšããäºå®ã¯ããã®ãããªç¶æ³ã§ã¯TypeScriptã«é Œãã®ãèªç¶ãªããã§ããããŒããµãŒããŒã®ã»ããã¢ããã¯éåžžã«é«éã§ãéåžžã¯äžèŠãªäŸåé¢ä¿ã¯ãããŸãããããã«ãããã·ã¹ãã ãªãœãŒã¹ãç¯çŽãããŸããããããNode.jsãšTypeScriptã®åŒ·åãªã¿ã€ãã·ã¹ãã ã®çµã¿åããããæ°ããæ©èœãããã«äœæããã®ã«éåžžã«å¹æçã§ããçç±ã§ãã
æåŸã«ãTypeScriptã¯æ§æã·ã¥ã¬ãŒã§ååã«å³ä»ããããŠãããããTypeScriptã䜿çšããéçºã¯çŽ æŽãããé«éã§ãã