æååããŒã¹ã®åæåã®åã¯ãå€ãã¯ãªããžã§ã¯ãã«ãã©ãŒã«ããã¯ããŠããŸããã ãªããžã§ã¯ãã䜿çšãããšãåãæ¡åŒµããããšãã§ããŸãã äŸãã°ïŒ
const BasicEvents = {
Start: "Start",
Finish: "Finish"
};
const AdvEvents = {
...BasicEvents,
Pause: "Pause",
Resume: "Resume"
};
æåååæåã«åãæ¿ããå Žåãåæåãåå®çŸ©ããã«ãããå®çŸããããšã¯äžå¯èœã§ãã
ç§ã¯ãã®ãããªããšãããããšãã§ãããšéåžžã«äŸ¿å©ã§ãïŒ
enum BasicEvents {
Start = "Start",
Finish = "Finish"
};
// extend enum using "extends" keyword
enum AdvEvents extends BasicEvents {
Pause = "Pause",
Resume = "Resume"
};
çæãããåæåããªããžã§ã¯ãã§ããããšãèãããšããããããã»ã©ã²ã©ãããšã§ã¯ãããŸããã
// extend enum using spread
enum AdvEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
};
å°ãéãã ã ãã§ãçŸåšãæ¡åŒµã¿ã€ãã®ãªããžã§ã¯ãã䜿çšããŠãã®æ¡åŒµãå®è¡ã§ãããããããã¯æ£åžžã«æ©èœããã¯ãã§ãã
enum BasicEvents {
Start = "Start",
Finish = "Finish"
};
// extend enum using "extends" keyword
const AdvEvents = {
...BasicEvents,
Pause: "Pause",
Resume: "Resume"
};
泚æããŠãã ãããããªãã¯è¿ã¥ãããšãã§ããŸã
enum E {}
enum BasicEvents {
Start = 'Start',
Finish = 'Finish'
}
enum AdvEvents {
Pause = 'Pause',
Resume = 'Resume'
}
function enumerate<T1 extends typeof E, T2 extends typeof E>(e1: T1, e2: T2) {
enum Events {
Restart = 'Restart'
}
return Events as typeof Events & T1 & T2;
}
const e = enumerate(BasicEvents, AdvEvents);
å¿ èŠã«å¿ããŠãå¥ã®ãªãã·ã§ã³ã¯å ±çšäœã¿ã€ãã䜿çšããããšã§ãã
const enum BasicEvents {
Start = 'Start',
Finish = 'Finish'
}
const enum AdvEvents {
Pause = 'Pause',
Resume = 'Resume'
}
type Events = BasicEvents | AdvEvents;
let e: Events = AdvEvents.Pause;
æ¬ ç¹ã¯ã Events.Pause
ã䜿çšã§ããªãããšã§ãã AdvEvents.Pause
ã䜿çšããå¿
èŠããããŸãã conståæåã䜿çšããŠããå Žåãããã¯ããããåé¡ãããŸããã ããããªããšããŠãŒã¹ã±ãŒã¹ã«ååã§ãªãå¯èœæ§ããããŸãã
匷ãåä»ããããReduxã¬ãã¥ãŒãµãŒã«ã¯ãã®æ©èœãå¿ èŠã§ãã TypeScriptã«è¿œå ããŠãã ããã
å¥ã®åé¿çã¯ãåæåã䜿çšããã«ãåæåã®ããã«èŠãããã®ã䜿çšããããšã§ãã
const BasicEvents = {
Start: 'Start' as 'Start',
Finish: 'Finish' as 'Finish'
};
type BasicEvents = (typeof BasicEvents)[keyof typeof BasicEvents];
const AdvEvents = {
...BasicEvents,
Pause: 'Pause' as 'Pause',
Resume: 'Resume' as 'Resume'
};
type AdvEvents = (typeof AdvEvents)[keyof typeof AdvEvents];
ãã¹ãŠã®åé¿çã¯çŽ æŽãããã§ãããå¯èœãªéãåçŽãªåŸ¹åºçãªãã§ãã¯ã䜿çšã§ããããã«ãtypescriptèªäœããã®åæåç¶æ¿ã®ãµããŒãã確èªããããšæããŸãã
åæåã®ä»£ããã«ã¯ã©ã¹ã䜿çšããŠãã ããã
ç§ã¯ãããè©ŠããŠããŸããã
const BasicEvents = {
Start: 'Start' as 'Start',
Finish: 'Finish' as 'Finish'
};
type BasicEvents = (typeof BasicEvents)[keyof typeof BasicEvents];
const AdvEvents = {
...BasicEvents,
Pause: 'Pause' as 'Pause',
Resume: 'Resume' as 'Resume'
};
type AdvEvents = (typeof AdvEvents)[keyof typeof AdvEvents];
type sometype<T extends AdvEvents> =
T extends typeof AdvEvents.Start ? 'Some String' :
T extends typeof AdvEvents.Finish ? 'Some Other String' :
T extends typeof AdvEvents.Pause ? 'Abc' :
T extends typeof AdvEvents.Resume ? 'Xyz' : never;
type r = sometype<typeof AdvEvents.Finish>;
ãããè¡ãããã®ããè¯ãæ¹æ³ããªããã°ãªããŸããã
ãªãããã¯ãã§ã«æ©èœã§ã¯ãªãã®ã§ããïŒ é倧ãªå€æŽã¯ãªããçŽæçãªåäœããã®æ©èœãç©æ¥µçã«æ€çŽ¢ããŠèŠæ±ãã80人以äžã®äººã âããã¯ç°¡åãªããšã®ããã§ãã
åå空éå ã®å¥ã®ãã¡ã€ã«ããåæåãåãšã¯ã¹ããŒãããããšã§ãããåæåãæ¡åŒµããã«æ¬åœã«å¥åŠã§ãïŒãããŠããªããžã§ã¯ããã¿ã€ãã§ã¯ãªãããŸã åæåã§ããæ¹æ³ã§åæåãåãšã¯ã¹ããŒãããããšã¯äžå¯èœã§ãïŒïŒ
import { Foo as _Foo } from './Foo';
namespace Bar
{
enum Foo extends _Foo {} // nope, doesn't work
const Foo = _Foo;
type Foo = _Foo;
}
Bar.Foo // actually not an enum
+1
çŸåšåé¿çã䜿çšããŠããŸãããããã¯ãã€ãã£ãã®åæåæ©èœã§ããå¿
èŠããããŸãã
ç§ã¯ãã®åé¡ããã£ãšèŠãŠã誰ãã次ã®è³ªåãæèµ·ãããã©ããã確èªããŸããã ïŒããã§ã¯ãªãããã§ããïŒ
OPããïŒ
enum BasicEvents {
Start = "Start",
Finish = "Finish"
};
// extend enum using "extends" keyword
enum AdvEvents extends BasicEvents {
Pause = "Pause",
Resume = "Resume"
};
AdvEvents
ãBasicEvents
ã«å²ãåœãŠãããããšã人ã
ã¯æåŸ
ããŸããïŒ ïŒããšãã°ãã¯ã©ã¹ã®å Žåã¯extends
ã®å Žåã§ããïŒ
ã¯ãã®å Žåãåæåã¯æçµçãªãã®ã§ãããæ¡åŒµã§ããªããšããäºå®ãšã©ã®çšåºŠäžèŽããŠããŸããïŒ
@masakçŽ æŽããããã€ã³ãã 人ã
ãããã§æãã§ããæ©èœã¯ãéåžžã®extends
ãšã¯ãŸã£ããç°ãªããŸãã BasicEvents
ã¯AdvEvents
ã«å²ãåœãŠãå¿
èŠãããããã®éã§ã¯ãããŸããã éåžžã®extends
ãå¥ã®åãããå
·äœçã«ããããã«æ¹è¯ããŸãããã®å Žåãä»ã®åãæ¡åŒµããŠå€ãè¿œå ããããããã®ããã®ã«ã¹ã¿ã æ§æã§ã¯ãããããextends
ããŒã¯ãŒãã䜿çšããªãã§ãã ããããŸãã¯ãå°ãªããšãæ§æenum A extends B {
ã䜿çšããªãã§ãã ããã
ãã®ç¹ã§ãç§ã¯OPããã®ããã®æ®åã®ææ¡ã奜ãã§ããã
// extend enum using spread
enum AdvEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
};
æ¡æ£ã¯ãå ã®ã³ããŒãæ¥ç¶ãããŠããªãã³ããŒã«æµ ãè€è£œããããšããæåŸ ããã§ã«æã£ãŠããããã§ãã
BasicEvents
ã¯AdvEvents
ã«å²ãåœãŠãå¿ èŠãããããã®éã§ã¯ãããŸããã
ããããã¹ãŠã®å Žåã«ã©ã®ããã«åœãŠã¯ãŸããã¯ããããŸãããç§ã®èšãããããšãç解ããã°ããã¹ãŠã®å Žåã«åœãŠã¯ãŸããã©ããã¯ããããŸããã ãã¡ã€ã³ã«äŸåãããããã®åæå€ãã³ããŒãããçç±ã«äŸåããŠããããã«æããŸãã
åé¿çã«ã€ããŠããå°ãèããŸãããhttpsïŒ //github.com/Microsoft/TypeScript/issues/17592#issuecomment -331491147ã䜿çšããŠãå€ã«Events
ãå®çŸ©ããããšã§ãããå°ãããŸãããããšãã§ããŸããã¹ããŒã¹ïŒ
enum BasicEvents {
Start = 'Start',
Finish = 'Finish'
}
enum AdvEvents {
Pause = 'Pause',
Resume = 'Resume'
}
type Events = BasicEvents | AdvEvents;
const Events = {...BasicEvents, ...AdvEvents};
let e: Events = Events.Pause;
ç§ã®ãã¹ãããã Events.Start
ã¯åã·ã¹ãã ã§BasicEvents.Start
ãšããŠæ£ãã解éãããŠããããã«èŠããã®ã§ã培åºçãªãã§ãã¯ãšèå¥ãããå
±çšäœã®æ¹è¯ã¯ããŸãæ©èœããŠããããã§ãã æ¬ ããŠããäž»ãªç¹ã¯ã Events.Pause
ãåãªãã©ã«ãšããŠäœ¿çšã§ããªãããšã§ãã AdvEvents.Pause
ãå¿
èŠã§ãã typeof Events.Pause
ã䜿çšãããšã AdvEvents.Pause
ã«è§£æ±ºãããŸãããç§ã®ããŒã ã®äººã
ã¯ãã®ãããªãã¿ãŒã³ã«æ··ä¹±ããŠããã®ã§ãå®éã«ã¯AdvEvents.Pause
ã䜿çšããããšããå§ãããŸããã¿ã€ããšããŠã
ïŒããã¯ãå€ç«ããåæåã§ã¯ãªããåæåãçžäºã«å²ãåœãŠå¯èœã«ãããå Žåã§ããç§ã®çµéšãããããããå²ãåœãŠå¯èœã«ããã®ãæãäžè¬çã§ããïŒ
å¥ã®ææ¡ïŒå ã®åé¡ã¯è§£æ±ºãããŸãããïŒã代ããã«æååãªãã©ã«ã䜿çšããŠåã®å ±çšäœãäœæããã®ã¯ã©ãã§ããïŒ
type BEs = "Start" | "Finish";
type AEs = BEs | "Pause" | "Resume";
let example: AEs = "Finish"; // there is even autocompletion
ã ãããç§ãã¡ã®åé¡ã®è§£æ±ºçã¯ããã§ããããïŒ
const BasicEvents = {
Start: "Start",
Finish: "Finish"
};
// { Start: string, Finish: string };
const BasicEvents = {
Start: "Start",
Finish: "Finish"
} as const
// { Start: 'Start', Finish: 'Finish' };
åæåã®æ¡åŒµã¯ãTypeScriptã®ã³ã¢æ©èœã§ããå¿ èŠããããŸãã èšã£ãŠãã ã'
@wottpal以åã®ç§ã®è³ªåãç¹°ãè¿ããŸãïŒ
[åæåãæ¡åŒµã§ãã]å Žåãåæåã¯æçµçãªãã®ã§ãããæ¡åŒµã§ããªããšããäºå®ãšã©ã®çšåºŠäžèŽããŠããŸããïŒ
å ·äœçã«ã¯ãåæåã®å€ã«å¯Ÿããswitchã¹ããŒãã¡ã³ãã®å šäœçãªãã§ãã¯ã¯ãåæåã®éæ¡åŒµæ§ã«äŸåããŠããããã«æãããŸãã
@masakãªã«ïŒ ããããããã§ã¯ãããŸããïŒ æ¡åŒµåæåã¯ããåºãã¿ã€ãã§ãããå ã®åæåã«å²ãåœãŠãããšãã§ããªãããã䜿çšãããã¹ãŠã®åæåã®ãã¹ãŠã®å€ãåžžã«ç¥ã£ãŠããŸãã ãã®ã³ã³ããã¹ãã§æ¡åŒµãããšããããšã¯ãå€ãåæåãå€æŽããã®ã§ã¯ãªããæ°ããåæåãäœæããããšãæå³ããŸãã
enum A { a; }
enum B extends A { b; }
declare var a: A;
switch(a) {
case A.a:
break;
default:
// a is never
}
declare var b: B;
switch(b) {
case A.a:
break;
default:
// b is B.b
}
@ m93aãããã€ãŸããããã§ã®extends
ã¯ãå®éã«ã¯ïŒ A
ããB
$ãžã®åæå€ã®ïŒããå€ãã®_copying_ã»ãã³ãã£ã¯ã¹ãæã£ãŠãããšããããšã§ããïŒ ãããããšãã¹ã€ããã¯æ£åžžã«åºãŠããŸãã
ããããããã«ã¯ãŸã ç§ã«ã¯å£ããŠããããã«èŠãã_ããã€ãã®_æåŸ
ããããŸãã ãããçªãæ¢ããæ¹æ³ãšããŠïŒã¯ã©ã¹ã§ã¯ã extends
ã¯ã³ããŒã»ãã³ãã£ã¯ã¹ãäŒéããŸããâãã£ãŒã«ããšã¡ãœããã¯æ¡åŒµãµãã¯ã©ã¹ã«ã³ããŒãããŸããã 代ããã«ããããã¿ã€ããã§ãŒã³ãä»ããŠå©çšã§ããããã«ãªããŸãã ã¹ãŒããŒã¯ã©ã¹ã«ã¯ããã£ãŒã«ããŸãã¯ã¡ãœããã1ã€ã ããããŸãã
ãã®ããã class B extends A
ã®å Žåã B
ãA
ã«å²ãåœãŠå¯èœã§ããããšãä¿èšŒãããŸãããããã£ãŠãããšãã°let a: A = new B();
ã¯å®å
šã«åé¡ãããŸããã
ãã ããåæåãšextends
ã䜿çšãããšã察å¿ããä¿èšŒããªãããã let a: A = B.b;
ãå®è¡ã§ããŸããã ãããç§ã«ãšã£ãŠå¥åŠã«æããããšã§ãã ããã§extends
ã¯ãäœãã§ãããã«ã€ããŠã®ç¹å®ã®äžé£ã®ä»®å®ãäŒããŸããããããã¯åæåã§ã¯æºããããŠããŸããã
次ã«ããããexpands
ãŸãã¯clones
ãšåŒã³ãŸããïŒ ð€·ââïž
ãŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãåºæ¬çãªããšãç°¡åã«å®çŸã§ããªãã®ã¯å¥åŠã«æããŸãã
åççãªã»ãã³ãã£ã¯ã¹ããŸã£ããæ°ããããŒã¯ãŒããå¿
èŠãšããå ŽåïŒä»ã®èšèªã®å
è¡æè¡ã¯ã»ãšãã©ãããŸããïŒã代ããã«OPãšãã®ã³ã¡ã³ãã§ææ¡ãããŠããã¹ãã¬ããæ§æïŒ ...
ïŒãåå©çšããŸãããïŒ
+1
ãããããã©ã«ãã®åææ©èœã«è¿œå ãããããšãé¡ã£ãŠããŸãã :)
誰ãããšã¬ã¬ã³ããªè§£æ±ºçãç¥ã£ãŠããŸããïŒ ð§
åççãªã»ãã³ãã£ã¯ã¹ããŸã£ããæ°ããããŒã¯ãŒããå¿ èŠãšããå ŽåïŒä»ã®èšèªã®å è¡æè¡ã¯ã»ãšãã©ãããŸããïŒã代ããã«OPãšãã®ã³ã¡ã³ãã§ææ¡ãããŠããã¹ãã¬ããæ§æïŒ...ïŒãåå©çšããŸãããïŒ
ã¯ããããå°ãèããŠã¿ããšããã®è§£æ±ºçã¯è¯ããšæããŸãã
ãã®åé¡ã®ã¹ã¬ããå šäœãèªãã åŸãspreadæŒç®åãåå©çšããããšã§åé¡ã解決ããæ§æãæ··ä¹±ããã/çŽæçã§ãªããã®ã«ããããšã«é¢ããŠäººã ãæèµ·ãããã¹ãŠã®æžå¿µã«å¯ŸåŠãããšããå¹ åºãåæãããããã§ãã
// extend enum using spread
enum AdvancedEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
};
ãã®åé¡ã«ã¯ããã®æç¹ã§ãAwaiting MoreFeedbackãã©ãã«@RyanCavanaughãæ¬åœã«å¿ èŠã§ããïŒ
æ©èœã¯+1ãæãã§ããŸãã
ãã®åé¡ã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ åæåã«æ¡æ£æŒç®åãå®è£ ããŠãããšéåžžã«äŸ¿å©ã§ãã
ç¹ã«ãåæåããšã€ãªã¢ã¹ããã³æ¡åŒµããæ©èœã®ã¡ã¿ããã°ã©ãã³ã°ãå«ããŠãŒã¹ã±ãŒã¹ã§ã¯ãå¿
é ãšå¿
é ã®äžéã«ãããŸãã äžèšã®åé¿çã®ããããã«é ŒããªãéããçŸåšã1ã€ã®åæåãå¥ã®ååã§export
ååŸããæ¹æ³ã¯ãããŸããã
@ m93aãããã€ãŸããããã§ã®
extends
ã¯ãå®éã«ã¯ïŒA
ããB
$ãžã®åæå€ã®ïŒããå€ãã®_copying_ã»ãã³ãã£ã¯ã¹ãæã£ãŠãããšããããšã§ããïŒ ãããããšãã¹ã€ããã¯æ£åžžã«åºãŠããŸããããããããã«ã¯ãŸã ç§ã«ã¯å£ããŠããããã«èŠãã_ããã€ãã®_æåŸ ããããŸãã ãããçªãæ¢ããæ¹æ³ãšããŠïŒã¯ã©ã¹ã§ã¯ã
extends
ã¯ã³ããŒã»ãã³ãã£ã¯ã¹ãäŒéããŸããâãã£ãŒã«ããšã¡ãœããã¯æ¡åŒµãµãã¯ã©ã¹ã«ã³ããŒãããŸããã 代ããã«ããããã¿ã€ããã§ãŒã³ãä»ããŠå©çšã§ããããã«ãªããŸãã ã¹ãŒããŒã¯ã©ã¹ã«ã¯ããã£ãŒã«ããŸãã¯ã¡ãœããã1ã€ã ããããŸãããã®ããã
class B extends A
ã®å ŽåãB
ãA
ã«å²ãåœãŠå¯èœã§ããããšãä¿èšŒãããŸãããããã£ãŠãããšãã°let a: A = new B();
ã¯å®å šã«åé¡ãããŸããããã ããåæåãš
extends
ã䜿çšãããšã察å¿ããä¿èšŒããªããããlet a: A = B.b;
ãå®è¡ã§ããŸããã ãããç§ã«ãšã£ãŠå¥åŠã«æããããšã§ãã ããã§extends
ã¯ãäœãã§ãããã«ã€ããŠã®ç¹å®ã®äžé£ã®ä»®å®ãäŒããŸããããããã¯åæåã§ã¯æºããããŠããŸããã
@masakããªãã¯ã»ãŒæ£è§£ã ãšæããŸãããããªãã¯ééã£ãŠããå°ããªä»®å®ã1ã€ããŸããã enum B extends A
ã®å ŽåãBã¯Aã«å²ãåœãŠå¯èœã§ãããå²ãåœãŠå¯èœããšã¯ãAãæäŸãããã¹ãŠã®å€ãBã§äœ¿çšã§ããããšãæå³ããŸãã let a: A = B.b
ãšèšã£ãå ŽåãBã®å€ã¯Aã§äœ¿çšå¯èœã§ããããã¯ãAã«å²ãåœãŠå¯èœãªå€ãšã¯ç°ãªããŸããBã¯Aã«å²ãåœãŠå¯èœã§ããããã let a: A = B.a
ã¯æ£ããã§ãã
ããã¯ã次ã®äŸã®ãããªã¯ã©ã¹ã䜿çšããŠæããã§ãã
class A {
a() {}
}
class B extends A {
b() {}
}
let a: A = new B();
a.a(); // valid
a.b(); // invalid via type system since `a` is typed as `A`
TypeScriptãã¬ã€ã°ã©ãŠã³ããªã³ã¯
ç°¡åã«èšãã°ãæ¡åŒµã¯æ£ããçšèªã§ãããšç§ã¯ä¿¡ããŠããŸããããããŸãã«è¡ãããŠããããšã ããã§ãã enum B extends A
ã®äŸã§ã¯ãBã¯Aã®ããµãã¯ã©ã¹ãïŒãµããšãã ïŒããã«ã¯ãã£ãšè¯ãåèªããããããããŸããïŒã§ãããããåžžã«Båæåã«Aåæåã®ãã¹ãŠã®å¯èœãªå€ãå«ãŸããããšãæåŸ
ã§ããŸãã Aã«å²ãåœãŠå¯èœã
ãããã£ãŠãæ°ããããŒã¯ãŒãã¯å¿ èŠãªããšæããŸããextendsã䜿çšããå¿ èŠããããããã¯ãã€ãã£ãã«TypeScriptã®äžéšã§ããå¿ èŠããããšæããŸãïŒD
@julian-sfç§ã¯ããªããæžãããã¹ãŠã®ãã®ã«åæãããšæããŸã...
...ããã...ïŒslightly_smiling_faceïŒ
ç§ãããã§åé¡ã«ããããã«ããã®ç¶æ³ã¯ã©ãã§ããïŒ
// example from OP
enum BasicEvents {
Start = "Start",
Finish = "Finish"
};
// extend enum using "extends" keyword
enum AdvEvents extends BasicEvents {
Pause = "Pause",
Resume = "Resume"
};
Pause
ãAdvEvents
ã®_ã€ã³ã¹ã¿ã³ã¹_ã§ããã AdvEvents
_extends_ BasicEvents
ã§ãããšãããšã Pause
ãBasicEvents
ã®_ã€ã³ã¹ã¿ã³ã¹_ã§ãããšæåŸ
ããŸããïŒ
äžæ¹ãåæåïŒIMHOïŒã®ã³ã¢ããªã¥ãŒããããžã·ã§ã³ã¯ã switch
ã¹ããŒãã¡ã³ãã®ãããªãã®ãå
šäœãæ³å®ã§ããããã«ãåæåã_closed _ / "final"ïŒéæ¡åŒµå¯èœïŒã§ãããšããããšã§ãã ïŒãããã£ãŠã AdvEvents
ãBasicEvent
ã§ããããšã®æå³ã_æ¡åŒµ_ã§ããããšã¯ãåæåã®ããçš®ã®é©ãæå°ã®ååã«éåããŸããïŒ
次ã®3ã€ã®ããããã£ã®ãã¡2ã€ãè¶ ããããšã¯ã§ããªããšæããŸãã
enum
宣èšéã®extends
é¢ä¿b
ãB
ãšB extends A
ã®ã€ã³ã¹ã¿ã³ã¹ã§ããå Žåã b
ã¯A
ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããšããïŒåççãªïŒä»®å®@masakç§ã¯åæåã®éããããªã³ã·ãã«ãç解ããŠåæããŸãïŒå®è¡æïŒã ãã ããã³ã³ãã€ã«æã®æ¡åŒµã¯ããã¹ãŠã³ã³ãã€ã©ã«ãã£ãŠå®çŸ©ããã³æ§ç¯ããããããå®è¡æã«ã¯ããŒãºãååã«éåããããšã¯ãããŸããã
bãBã®ã€ã³ã¹ã¿ã³ã¹ã§ãããBãAãæ¡åŒµããå Žåãbã¯Aã®ã€ã³ã¹ã¿ã³ã¹ã§ãããšããïŒåççãªïŒä»®å®
ã€ã³ã¹ã¿ã³ã¹/ã¯ã©ã¹ã®äºåæ³ã¯å®éã«ã¯åæåã«å²ãåœãŠãããªãããããã®æšè«ã¯äžçš®ã®èª€è§£ãæããšæããŸãã åæåã¯ã¯ã©ã¹ã§ã¯ãªããã€ã³ã¹ã¿ã³ã¹ããããŸããã ãã ããé©åã«å®è¡ããã°ãæ¡åŒµå¯èœã«ãªããšæããŸãã åæåãã»ããã®ããã«èããŠãã ããã ãã®äŸã§ã¯ãBã¯Aã®ã¹ãŒããŒã»ããã§ãããããã£ãŠãAã®ä»»æã®å€ãBã«ååšãããšæ³å®ããã®ã劥åœã§ãããBã®äžéšã®å€ã®ã¿ãAã«ååšããŸãã
ç§ã¯æžå¿µãã©ãããæ¥ãŠããã®ãç解ããŠããŸã...ãããã ãããŠãç§ã¯ããã«ã€ããŠäœããã¹ããããããŸããã åæåæ¡åŒµã«é¢ããåé¡ã®è¯ãäŸïŒ
const enum A { a = 'a' }
const enum B extends A { b = 'b' }
const foo = (a: A) => console.log(a);
const bar = (b: B) => foo(b);
bar(B.a); // 'a'
bar(B.b); // uh-oh, b doesn't exist on A, so foo would get unexpected behavior
// HOWEVER, this would work just fine...
const baz = (a: A) => bar(a);
baz(A.a); // 'a'
baz(B.a); // 'a'
baz(B.b); // compiler error as expected...
ãã®å Žåãåæåã¯ã¯ã©ã¹ãšã¯ãŸã£ããç°ãªãåäœãããŸãã ããããã¯ã©ã¹ã®å ŽåãBãAã«ç°¡åã«ãã£ã¹ãã§ãããšæåŸ ã§ããŸãããããã§ã¯æããã«æ©èœããŸããã ç§ã¯å¿ ããããããæªããšã¯æããŸãããç§ã¯ããããã 説æãããã¹ãã ãšæããŸãã IEã§ã¯ãã¯ã©ã¹ã®ããã«ç¶æ¿ããªãŒã§åæåãäžåãã«ã¹ã³ãŒãããããšã¯ã§ããŸããã ããã¯ããBã®ãã¹ãŠã®å€ãAã«ååšããããã§ã¯ãªããããã¹ãŒããŒã»ããåæåBãAã«å²ãåœãŠãããšãã§ããªãããšããè¡ã«æ²¿ã£ãã³ã³ãã€ã©ãšã©ãŒã§èª¬æã§ããŸãã
@ julian-sf
ã€ã³ã¹ã¿ã³ã¹/ã¯ã©ã¹ã®äºåæ³ã¯å®éã«ã¯åæåã«å²ãåœãŠãããªãããããã®æšè«ã¯äžçš®ã®èª€è§£ãæããšæããŸãã åæåã¯ã¯ã©ã¹ã§ã¯ãªããã€ã³ã¹ã¿ã³ã¹ããããŸããã
ããªãã¯çµ¶å¯Ÿã«æ£ããã§ããããã«çŽé¢ããŠã
ããã«ã€ããŠèãããšãç§ã¯Javaã®åæåã®èãæ¹ã«ãã£ãŠå°ãè²ä»ããããŠããããšã«æ°ä»ããŸãã Javaã§ã¯ãåæå€ã¯æåéãåæåã®ã€ã³ã¹ã¿ã³ã¹ã§ãã å®è£
ã«é¢ããŠã¯ãenumã¯Enumã¯ã©ã¹ãæ¡åŒµããã¯ã©ã¹ã§ãã ïŒæåã§è¡ãããšã¯èš±å¯ãããŠããŸããenum
ããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãããããã¯å
éšã§è¡ãããŸããïŒããã®è¯ãç¹ã¯ãåæåããã¹ãŠã®äŸ¿å©ãªã¯ã©ã¹ãååŸããããšã§ãããã£ãŒã«ããã³ã³ã¹ãã©ã¯ã¿ãŒãã¡ãœãããæã€ããšãã§ããŸã...ãã®ã¢ãããŒãã§ã¯ãåæåã¡ã³ããŒã¯ã€ã³ã¹ã¿ã³ã¹ã§ãã ïŒJLSãåãããã«èšã£ãŠããŸããïŒ
TypeScriptåæåã»ãã³ãã£ã¯ã¹ãžã®å€æŽãææ¡ããŠããªãããšã«æ³šæããŠãã ããã ç¹ã«ãTypeScriptãåæåã«Javaã®ã¢ãã«ã䜿çšããããã«å€æŽããå¿ èŠããããšèšã£ãŠããã®ã§ã¯ãããŸããã ç§ã¯ãåæå/åæåã¡ã³ããŒã®äžã«ã¯ã©ã¹/ã€ã³ã¹ã¿ã³ã¹ã®ãç解ãããªãŒããŒã¬ã€ããããšã¯ãæçã§æŽå¯ã«æºã¡ãŠãããšèšã£ãŠããŸãã ãåæåã¯ã¯ã©ã¹ã§ããããŸãã¯ãåæåã¡ã³ããŒã¯ã€ã³ã¹ã¿ã³ã¹ã§ãããã§ã¯ãããŸãã...ããããåŒãç¶ãããé¡äŒŒç¹ããããŸãã
ã©ã®ãããªé¡äŒŒç¹ããããŸããïŒ äœããããŸããã¡ã³ããŒã·ãããå ¥åããŸãã
enum Foo { A, B, C }
enum Bar { X, Y, Z }
let foo: Foo = Foo.C;
foo = Bar.Z;
Bar.Z
ã¯Foo
ã§ã¯ãªããããæåŸã®è¡ã¯ã¿ã€ããã§ãã¯ããŸããã ç¹°ãè¿ããŸãããããã¯_å®éã«ã¯_ã¯ã©ã¹ãšã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŸãããã Foo
ãšBar
ãã¯ã©ã¹ã§ããã6ã€ã®ã¡ã³ããŒãããããã®ã€ã³ã¹ã¿ã³ã¹ã§ãããã®ããã«ãåãã¢ãã«ã䜿çšããŠ_ç解_ã§ããŸãã
ïŒãã®åŒæ°ã®ç®çäžã let foo: Foo = 2;
ãæå³çã«æå¹ã§ãããäžè¬ã«number
å€ãåæåã®å€æ°ã«å²ãåœãŠå¯èœã§ãããšããäºå®ã¯ç¡èŠããŸããïŒ
åæåã«ã¯ã_closed_ãšããè¿œå ã®ããããã£ããããŸãâç³ãèš³ãããŸããããããã«é©ããçšèªã¯ããããŸããâäžåºŠå®çŸ©ãããšãåæåãæ¡åŒµããããšã¯ã§ããŸããã å
·äœçã«ã¯ãåæå宣èšå
ã«ãªã¹ããããŠããã¡ã³ããŒã¯ãåæåãšåãäžèŽãã_only_ãã®ã§ãã ïŒãéäžç仮説ãã®ããã«ãéããïŒããã¯ãåæåã®switch
ã¹ããŒãã¡ã³ãã®ãã¹ãŠã®ã±ãŒã¹ãã«ããŒãããŠããããšãå®å
šã«ç¢ºå®ã«ç¢ºèªã§ãããããåªããããããã£ã§ãã
åæåã«extends
ãããå Žåããã®ããããã£ã¯ãŠã£ã³ããŠã®å€ã«åºãŸãã
ããªããæžãã
ç§ã¯åæåã®éããããªã³ã·ãã«ãç解ããåæããŸãïŒå®è¡æïŒã ãã ããã³ã³ãã€ã«æã®æ¡åŒµã¯ããã¹ãŠã³ã³ãã€ã©ã«ãã£ãŠå®çŸ©ããã³æ§ç¯ããããããå®è¡æã«ã¯ããŒãºãååã«éåããããšã¯ãããŸããã
åæåãæ¡åŒµããã³ãŒãããããžã§ã¯ãã«å«ãŸããŠããããšãåæãšããŠãããããããã¯çå®ã§ã¯ãªããšæããŸãã ãã ãããµãŒãããŒãã£ã®ã¢ãžã¥ãŒã«ã§åæåãæ¡åŒµã§ããŸããçªç¶ãã³ã³ãã€ã«ããã³ãŒãã®å¶åŸ¡å€ã§ãåæåã«ãå²ãåœãŠå¯èœãª_new_enumã¡ã³ããŒãååšããŸãã åºæ¬çã«ãåæåã¯ãã³ã³ãã€ã«æã§ãããéããããªããªããŸãã
ç§ã¯ãŸã ç§ãæå³ããããšãæ£ç¢ºã«è¡šçŸããã®ã«å°ãäžåšçšã ãšæããŠããŸãããããã¯éèŠã ãšæããŸãïŒ$ïŒ$ enum
ïŒ$ã®extends
ã¯åæåã®æã貎éãªæ©èœã®1ã€ãå£ããŸãåééã ãŸãã«ãã®çç±ãããåæåã絶察çã«_çŠæ¢_æ¡åŒµ/ãµãã¯ã©ã¹åããèšèªã®æ°ãæ°ããŠãã ããã
åé¿çã«ã€ããŠããå°ãèããŸããã ïŒ17592ïŒã³ã¡ã³ãïŒã䜿çšããŠãå€ã¹ããŒã¹ã«
Events
ãå®çŸ©ããããšã§ãããå°ãããŸãããããšãã§ããŸããenum BasicEvents { Start = 'Start', Finish = 'Finish' } enum AdvEvents { Pause = 'Pause', Resume = 'Resume' } type Events = BasicEvents | AdvEvents; const Events = {...BasicEvents, ...AdvEvents}; let e: Events = Events.Pause;
ç§ã®ãã¹ãããã
Events.Start
ã¯åã·ã¹ãã ã§BasicEvents.Start
ãšããŠæ£ãã解éãããŠããããã«èŠããã®ã§ã培åºçãªãã§ãã¯ãšèå¥ãããå ±çšäœã®æ¹è¯ã¯ããŸãæ©èœããŠããããã§ãã æ¬ ããŠããäž»ãªç¹ã¯ãEvents.Pause
ãåãªãã©ã«ãšããŠäœ¿çšã§ããªãããšã§ããAdvEvents.Pause
ãå¿ èŠã§ãã ããªãã¯typeof Events.Pause
ã䜿çšã§ããAdvEvents.Pause
ã«è§£æ±ºãããŸãããç§ã®ããŒã ã®äººã ã¯ãã®ãããªãã¿ãŒã³ã«æ··ä¹±ããŠããã®ã§ãå®éã«ã¯AdvEvents.Pause
ã䜿çšããããšããå§ãããŸããã¿ã€ããšããŠãïŒããã¯ãå€ç«ããåæåã§ã¯ãªããåæåãçžäºã«å²ãåœãŠå¯èœã«ãããå Žåã§ããç§ã®çµéšãããããããå²ãåœãŠå¯èœã«ããã®ãæãäžè¬çã§ããïŒ
ãããä»ã®ãšããæãè¿ã解決çã ãšæããŸãã
ããããšã@alangpierce ïŒ+1ïŒ
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
@sdwvitç§ã¯äžæ žçãªäººç©ã§ã¯ãããŸããããç§ã®èŠå°ãããããšã次ã®æ§æææ¡ïŒOPããã§ããããã®åŸ2ååææ¡ãããŸãïŒã¯ãæ¢ç¥ã®åé¡ãªãã«ããã¹ãŠã®äººã幞ãã«ããŸãã
// extend enum using spread
enum AdvEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
};
extends
ã䜿çšããã«ããã®äžèŠäŸ¿å©ãªããã®ä»ã®åæåã®ãã¹ãŠã®ã¡ã³ããŒãè€è£œãããæ©èœãå®è£
ããããšãæå³ããããã_me_ã¯å¹žãã«ãªããŸããããã¯ãç§ãè¿°ã¹ãçç±ã§åé¡ããããšèããŠããŸãã ...
æ§æã¯ãæ¡åŒµã§ã¯ãªãã³ããŒããããšã§ãããã®åé¡ãåé¿ããŸãã
ãã®åé¡ã¯ãŸã ããã£ãŒãããã¯ãåŸ ã£ãŠããŸãããšããŒã¯ãããŠãããã³ã¢ã¡ã³ããŒãå¿ èŠã ãšæããéãããã®ã«ããŽãªã«ãšã©ãŸãæš©å©ãå°éããŸãã ããããŸãã誰ããäžèšãå®è£ ããŠPRãšããŠæåºããããšã劚ãããã®ã¯äœããããŸããã
@masakãåçããããšãããããŸãã ç§ã¯ä»ããã¹ãŠã®è°è«ã®æŽå²ãçµéšããªããã°ãªããŸããã åŸã«æ»ã£ãŠããŸã:)
ç§ã¯ãããèµ·ããã®ã絶察ã«èŠãããšæããŸããããããèªåã§å®è£ ããããšçµ¶å¯Ÿã«æãã§ããŸãã ãã ãããã¹ãŠã®åæåã®åäœãå®çŸ©ããå¿ èŠããããŸãã ããã¯ãã¹ãŠæååããŒã¹ã®åæåã§ããŸãæ©èœããŸãããããã©æ°å€åæåã«ã€ããŠã¯ã©ãã§ããããã ããã§æ¡åŒµ/ã³ããŒã¯ã©ã®ããã«æ©èœããŸããïŒ
ãåãã¿ã€ããã®åæåïŒæ°å€ã¯æ°å€ãæ¡åŒµããæååã¯æååãæ¡åŒµããŸãïŒã§åæåãæ¡åŒµããããšã ããèš±å¯ããããšæããŸãã ç°çš®åæåã¯æè¡çã«ãµããŒããããŠããã®ã§ããã®ãµããŒããç¶æããå¿ èŠããããšæããŸãã
è€æ°ã®åæåããã®æ¡åŒµãèš±å¯ããå¿ èŠããããŸããïŒ ãããã¯ãã¹ãŠçžäºã«æä»çãªå€ãæã€å¿ èŠããããŸããïŒ ãŸãã¯ãå€ã®éè€ãèš±å¯ããŸããïŒ èŸæžåŒé åºã«åºã¥ãåªå é äœïŒ
æ¡åŒµåæåã¯æ¡åŒµåæåã®å€ããªãŒããŒã©ã€ãã§ããŸããïŒ
æ¡åŒµåæåã¯ãå€ã®ãªã¹ãã®å é ãšããŠè¡šç€ºãããå¿ èŠããããŸããããããšãä»»æã®é åºã«ããããšãã§ããŸããïŒ åŸã§å®çŸ©ãããå€ã®æ¹ãåªå 床ãé«ããšæããŸããïŒ
æé»ã®æ°å€ã¯ãæ¡åŒµãããæ°å€åæåã®æ倧å€ã®åŸã«1ã€ç¶ããšæããŸãã
ããããã¹ã¯ã«é¢ããç¹å¥ãªèæ ®äºé ïŒ
ãªã©ãªã©ã
@JeffreyMercadoãããã¯è¯ã質åã§ãããå®è£ ãè©Šã¿ãã人ã«é©ããŠããŸãã ïŒç¬é¡ïŒ
以äžã¯ããä¿å®çãªãèšèšã¢ãããŒãã«åºã¥ããç§ã®åçã§ãïŒãäžäœäºææ§ãç¶æããªãããåŸã§å€æŽããã®ãé£ããéžæãè¡ãã®ã§ã¯ãªããäžæãªã±ãŒã¹ãèš±å¯ããªãèšèšäžã®æ±ºå®ãäžããŸãããããªã©ïŒã
- ãåãã¿ã€ããã®åæåã§åæåãæ¡åŒµããããšã ããèš±å¯ããããšæããŸãïŒæ°å€ã¯æ°å€ãæ¡åŒµããæååã¯æååãæ¡åŒµããŸãïŒ
ç§ãããæããŸãã çµæãšããŠåŸãããæ··ååã®åæåã¯ãããŸãæçšã§ã¯ãªãããã§ãã
- è€æ°ã®åæåããã®æ¡åŒµãèš±å¯ããå¿ èŠããããŸããïŒ ãããã¯ãã¹ãŠçžäºã«æä»çãªå€ãæã€å¿ èŠããããŸããïŒ ãŸãã¯ãå€ã®éè€ãèš±å¯ããŸããïŒ èŸæžåŒé åºã«åºã¥ãåªå é äœïŒ
ããã¯ãç§ãã¡ã話ããŠããã»ãã³ãã£ã¯ã¹ãã³ããŒããŠãããããè€æ°ã®åæåãè€è£œããããšã¯ãC++ã®å€éç¶æ¿ãããã倧äžå€«ãã®ããã§ãã ç¹ã«ãªããžã§ã¯ãã¹ãã¬ããã®ã¢ãããžãŒã«åºã¥ããŠæ§ç¯ãç¶ããå Žåãåé¡ã¯ããã«ã¯ããããŸããïŒ let newEnum = { ...enumA, ...enumB };
ãã¹ãŠã®ã¡ã³ããŒãçžäºã«æä»çãªå€ãæã€å¿ èŠããããŸããïŒ ä¿å®çãªããšã¯ããã¯ãããšèšãããšã§ãã ç¹°ãè¿ãã«ãªããŸããããªããžã§ã¯ãã¹ãã¬ããã®ã¢ãããžãŒã¯ã代æ¿ã®ã»ãã³ãã£ã¯ã¹ãæäŸããŸããæåŸã®1ã€ãåã¡ãŸãã
åæå€ããªãŒããŒã©ã€ãã§ããã°å¹žããªãŠãŒã¹ã±ãŒã¹ã¯èããããŸããã ããããããã¯ç§ã®åŽã®æ³ååã®æ¬ åŠãããããŸããã è¡çªãçŠæ¢ããä¿å®çãªã¢ãããŒãã«ã¯ã説æ/å éšåã容æãªå¿å°ããç¹æ§ããããå°ãªããšãçè«çã«ã¯ãå®éã®èšèšãšã©ãŒïŒæ°ããã³ãŒãããŸãã¯ç¶æãããŠããã³ãŒãïŒãæããã«ãªãå¯èœæ§ããããŸãã
- æ¡åŒµåæåã¯æ¡åŒµåæåã®å€ããªãŒããŒã©ã€ãã§ããŸããïŒ
ãã®å Žåã®çããšçç±ã¯ãåã®å Žåãšã»ãšãã©åãã ãšæããŸãã
- æ¡åŒµåæåã¯ãå€ã®ãªã¹ãã®å é ãšããŠè¡šç€ºãããå¿ èŠããããŸããããããšãä»»æã®é åºã«ããããšãã§ããŸããïŒ åŸã§å®çŸ©ãããå€ã®æ¹ãåªå 床ãé«ããšæããŸããïŒ
ããã¯ããªãŒããŒã©ã€ãã®ãæåŸã®1ã€ãåã€ãã»ãã³ãã£ã¯ã¹ã䜿çšããå Žåã«ã®ã¿éèŠã§ãããšæåã«èšããŸããã
ããããèãçŽããŠã¿ããšããè¡çªãªãããšãæåŸã®1ã€ãåã€ãã®äž¡æ¹ã§ãåæåããªã¹ãã«åºããåã«åæåã¡ã³ããŒå®£èšãé 眮ããã®ã¯å¥åŠã ãšæããŸãã ããšãã°ãããããããšã§ã©ã®ãããªæå³ãäŒããããŠããã®ã§ããããã ã¹ãã¬ããã¯ãèŒžå ¥åãã«å°ã䌌ãŠãããåŸæ¥ã¯ããããäžçªââäžã«ãããŸãã
åæåã¡ã³ããŒã®å®£èšã®åŸã«åæåã¹ãã¬ãããé 眮ããããšãå¿ ãããçŠæ¢ãããã¯ãããŸããïŒãã ããææ³ã§èš±å¯ãããŠããªããŠãåé¡ãªããšæããŸãïŒã ãããèš±å¯ãããããšã«ãªã£ãå Žåãããã¯ééããªãããªã³ã¿ãŒãšã³ãã¥ããã£ã®æ £ç¿ãåé¿å¯èœã§ãããšææããããšãã§ãããã®ã§ãã ããããçç±ã¯ãããŸããã
- æé»ã®æ°å€ã¯ãæ¡åŒµãããæ°å€åæåã®æ倧å€ã®åŸã«1ã€ç¶ããšæããŸãã
ããããä¿å®çãªããšã¯ãã¹ãã¬ããåŸã®æåã®ã¡ã³ããŒã«æ瀺çãªå€ãèŠæ±ããããšã§ãã
- ããããã¹ã¯ã«é¢ããç¹å¥ãªèæ ®äºé ïŒ
ããã¯äžèšã®ã«ãŒã«ã§ã«ããŒããããšæããŸãã
åæåãã€ã³ã¿ãŒãã§ã€ã¹ãããã³äžå€ãªããžã§ã¯ããçµã¿åãããããšã§ãåççãªããšãè¡ãããšãã§ããŸããã
export enum Unit {
SECONDS,
MINUTES,
HOURS,
DAYS,
WEEKS,
MONTHS,
YEARS,
DECADES,
CENTURIES,
MILLENNIA
}
interface Labels {
SINGULAR: Record<Unit, string>
PLURAL: Record<Unit, string>
LAST: string;
DELIM: string;
NOW: string;
}
export const EnglishLabels: Labels = {
SINGULAR: {
[Unit.SECONDS]: ' second',
[Unit.MINUTES]: ' minute',
[Unit.HOURS]: ' hour',
[Unit.DAYS]: ' day',
[Unit.WEEKS]: ' week',
[Unit.MONTHS]: ' month',
[Unit.YEARS]: ' year',
[Unit.DECADES]: ' decade',
[Unit.CENTURIES]: ' century',
[Unit.MILLENNIA]: ' millennium'
},
PLURAL: {
[Unit.SECONDS]: ' seconds',
[Unit.MINUTES]: ' minutes',
[Unit.HOURS]: ' hours',
[Unit.DAYS]: ' days',
[Unit.WEEKS]: ' weeks',
[Unit.MONTHS]: ' months',
[Unit.YEARS]: ' years',
[Unit.DECADES]: ' decades',
[Unit.CENTURIES]: ' centuries',
[Unit.MILLENNIA]: ' millennia'
},
LAST: ' and ',
DELIM: ', ',
NOW: ''
}
@illeatmyhatããã¯åæåã®è¯ã䜿ãæ¹ã§ãã...æ¢åã®åæåãæ¡åŒµãããã®ãšããŠã©ã®ããã«ã«ãŠã³ããããã®ãããããŸããã ããªããããŠããã®ã¯åæåã_䜿çš_ããããšã§ãã
ïŒãŸããåæåãswitchã¹ããŒãã¡ã³ããšã¯ç°ãªããããªãã®äŸã§ã¯å®å
šæ§ãã§ãã¯ããªãããã§ããåŸã§åæåã¡ã³ããŒãè¿œå ãã人ã¯ã SINGULAR
ãšPLURAL
ã«å¯Ÿå¿ããããŒãè¿œå ããã®ãç°¡åã«å¿ããŠããŸãå¯èœæ§ããããŸãã Label
ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§PLURAL
ã¬ã³ãŒããïŒ
@masak
åŸã§åæåã¡ã³ããŒãè¿œå ãã人ã¯ã
Label
SINGULAR
ããã³PLURAL
ã¬ã³ãŒãã«å¯Ÿå¿ããããŒãè¿œå ããã®ãç°¡åã«å¿ããŠããŸãå¯èœæ§ããããŸããïŒ
å°ãªããšãç§ã®ç°å¢ã§ã¯ãåæåã¡ã³ããŒãSINGULAR
ãŸãã¯PLURAL
ã®ããããã«ãªãå Žåããšã©ãŒãã¹ããŒãããŸãã Record
ã¿ã€ãããã®åœ¹å²ãæãããŠãããšæããŸãã
TSã®ããã¥ã¡ã³ãã¯åªããŠããŸãããå€ãã®æ©èœãç°¡åãªæ¹æ³ã§çµã¿åãããæ¹æ³ã®äŸã¯å€ããªããšæããŸãã enum inheritance
ã¯ãåœéåã®åé¡ã解決ããããšãããšãã«æåã«èª¿ã¹ããã®ã§ããã®ã¹ã¬ããã«ã€ãªãããŸããã ãšã«ããã¢ãããŒããééã£ãŠããããšãå€æããã®ã§ãç§ã¯ãã®æçš¿ãæžããŸããã
@illeatmyhat
å°ãªããšãç§ã®ç°å¢ã§ã¯ãåæåã¡ã³ããŒã
SINGULAR
ãŸãã¯PLURAL
ã®ããããã«ãªãå Žåããšã©ãŒãã¹ããŒãããŸããRecord
ã¿ã€ãããã®åœ¹å²ãæãããŠãããšæããŸãã
ããŒïŒ TILã ãããŠãã¯ããããã¯ãããã¯ããã«é¢çœãããŸãã æåã«åæåã®ç¶æ¿ã«å°éããæçµçã«ãã¿ãŒã³ã«å°éããããšã«ã€ããŠãããªããäœãæå³ããŠããã®ãããããŸãã ããã¯å€ç«ããããšã§ã¯ãªããããããŸããã ãX/Yã®åé¡ãã¯æ¬ç©ã§ãã ã MyEnum
ãæ¡åŒµãããããšããèãããå§ããŠããæçµçã«Record<MyEnum, string>
ã䜿çšãã人ãå¢ããå¯èœæ§ããããŸãã
åæåã®extendsã䜿çšãããšããã®ããããã£ã¯ãŠã£ã³ããŠã®å€ã«åºãŸãã
ããªããæžãã
@ julian-sfïŒåæåã®ã¯ããŒãºãããªã³ã·ãã«ãç解ããåæããŸãïŒå®è¡æïŒã ãã ããã³ã³ãã€ã«æã®æ¡åŒµã¯ããã¹ãŠã³ã³ãã€ã©ã«ãã£ãŠå®çŸ©ããã³æ§ç¯ããããããå®è¡æã«ã¯ããŒãºãååã«éåããããšã¯ãããŸããã
åæåãæ¡åŒµããã³ãŒãããããžã§ã¯ãã«å«ãŸããŠããããšãåæãšããŠãããããããã¯çå®ã§ã¯ãªããšæããŸãã ãã ãããµãŒãããŒãã£ã®ã¢ãžã¥ãŒã«ã§åæåãæ¡åŒµã§ããŸããçªç¶ãã³ã³ãã€ã«ããã³ãŒãã®å¶åŸ¡å€ã§ãåæåã«ãå²ãåœãŠå¯èœãªæ°ããåæåã¡ã³ããŒãã§ããŸãã åºæ¬çã«ãåæåã¯ãã³ã³ãã€ã«æã§ãããéããããªããªããŸãã
ããã«ã€ããŠèããã°èããã»ã©ãããªãã¯å®å šã«æ£ããã§ãã åæåãéããå¿ èŠããããŸãã åæåããäœæããããšããã¢ã€ãã¢ãæ¬åœã«å¥œãã§ãããããç§ãã¡ãããã§æãã§ããåé¡ã®æ žå¿ã ãšæãããã§ãð¥³ã
ãã®è¡šèšã¯ã2ã€ã®å¥ã ã®åæåããã€ãªãåãããããšããæŠå¿µãéåžžã«ãšã¬ã¬ã³ãã«èŠçŽããŠãããšæããŸãã
enum ComposedEnum = { ...EnumA, ...EnumB }
ãããã£ãŠã extends
ãšããçšèªã®äœ¿çšãèŸä»»ããããšãèæ
®ããŠãã ããð
- ãåãã¿ã€ããã®åæåïŒæ°å€ã¯æ°å€ãæ¡åŒµããæååã¯æååãæ¡åŒµããŸãïŒã§åæåãæ¡åŒµããããšã ããèš±å¯ããããšæããŸãã ç°çš®åæåã¯æè¡çã«ãµããŒããããŠããã®ã§ããã®ãµããŒããç¶æããå¿ èŠããããšæããŸãã
ç§ãããæããŸãã çµæãšããŠåŸãããæ··ååã®åæåã¯ãããŸãæçšã§ã¯ãªãããã§ãã
ç§ã¯ããã圹ã«ç«ããªãããšã«åæããŸãããããããããã§åæåã®ç°çš®ãµããŒããç¶æããå¿ èŠããããŸãã ããã§ã¯ãªã³ã¿ãŒèŠåã圹ç«ã€ãšæããŸãããTSããã®éªéã«ãªãããšã¯ãªããšæããŸãã äžèªç¶ãªãŠãŒã¹ã±ãŒã¹ãèããããšãã§ããŸããã€ãŸããæ°å€ãšæååãæ··åšãããã©ã°ãååŸãããéåžžã«äžååã«èšèšãããAPIãšã®å¯Ÿè©±çšã®åæåãæ§ç¯ããŠããŸãã èæ¡ããããç§ã¯ç¥ã£ãŠããŸãããããã¯ä»ã®å Žæã§èš±å¯ãããŠããã®ã§ãããã§ãããçŠæ¢ããã¹ãã§ã¯ãªããšæããŸãã
ãã¶ããããããªãããã«åŒ·ãå±ãŸããŸããïŒ
- è€æ°ã®åæåããã®æ¡åŒµãèš±å¯ããå¿ èŠããããŸããïŒ ãããã¯ãã¹ãŠçžäºã«æä»çãªå€ãæã€å¿ èŠããããŸããïŒ ãŸãã¯ãå€ã®éè€ãèš±å¯ããŸããïŒ èŸæžåŒé åºã«åºã¥ãåªå é äœïŒ
ããã¯ãç§ãã¡ã話ããŠããã»ãã³ãã£ã¯ã¹ãã³ããŒããŠãããããè€æ°ã®åæåãè€è£œããããšã¯ãC++ã®å€éç¶æ¿ãããã倧äžå€«ãã®ããã§ãã ç¹ã«ãªããžã§ã¯ãã¹ãã¬ããã®ã¢ãããžãŒã«åºã¥ããŠæ§ç¯ãç¶ããå Žåã¯ãããã«ã¯åé¡ãçºçããŸãããlet newEnum = {... enumAã... enumB};
100ïŒ åæãã
- ãã¹ãŠã®ã¡ã³ããŒãçžäºã«æä»çãªå€ãæã€å¿ èŠããããŸããïŒ
ä¿å®çãªããšã¯ããã¯ãããšèšãããšã§ãã ç¹°ãè¿ãã«ãªããŸããããªããžã§ã¯ãã¹ãã¬ããã®ã¢ãããžãŒã¯ã代æ¿ã®ã»ãã³ãã£ã¯ã¹ãæäŸããŸããæåŸã®1ã€ãåã¡ãŸãã
ç§ã¯ããã§åŒãè£ãããŠããŸãã 䟡å€èŠ³ã®çžäºç¬å ã匷å¶ããããšãããã¹ããã©ã¯ãã£ã¹ãã§ããããšã«åæããŸãããããã¯æ£ããã§ããïŒ ããã¯ãäžè¬çã«ç¥ãããŠããã¹ãã¬ããã»ãã³ãã£ã¯ã¹ãšã¯æ£å察ã§ãã äžæ¹ã§ã¯ãçžäºã«æä»çãªå€ãé©çšãããšããã¢ã€ãã¢ã奜ãã§ãããä»æ¹ã§ã¯ãã¹ãã¬ããã»ãã³ãã£ã¯ã¹ãã©ã®ããã«æ©èœãããã«ã€ããŠã®å€ãã®ä»®å®ãç ŽããŸãã ãæåŸã®1ã€ãåã€ããšããéåžžã®æ¡æ£ã«ãŒã«ã«åŸãããšã®æ¬ ç¹ã¯ãããŸããïŒ å®è£ ãç°¡åãªããã§ãïŒåºã«ãªããªããžã§ã¯ãã¯ãšã«ããåãªããããã§ããããïŒã ããããããã¯ãŸããäžè¬çãªæåŸ ãšäžèŽããŠããããã§ãã ç§ã¯ããã»ã©é©ãããšã§ã¯ãªãããšã«åŸããŠããŸãã
å€ããªãŒããŒã©ã€ããããå Žåã®è¯ãäŸããããããããŸããïŒç§ã¯ããããäœã§ãããã¯ããããŸãããïŒã
ããããèãçŽããŠã¿ããšããè¡çªãªãããšãæåŸã®1ã€ãåã€ãã®äž¡æ¹ã§ãåæåããªã¹ãã«åºããåã«åæåã¡ã³ããŒå®£èšãå ¥ããããšæãã®ã¯å¥åŠã ãšæããŸãã ããšãã°ãããããããšã§ã©ã®ãããªæå³ãäŒããããŠããã®ã§ããããã ã¹ãã¬ããã¯ãèŒžå ¥åãã«å°ã䌌ãŠãããåŸæ¥ã¯ããããäžçªââäžã«ãããŸãã
ããã¯ãã¹ãã¬ããã®ã»ãã³ãã£ã¯ã¹ã«åŸã£ãŠããå Žåã¯ãé åºãäœã§ãããã¯åé¡ã§ã¯ãªããã©ããã«ãã£ãŠç°ãªããŸãã æ£çŽãªãšãããçžäºã«æä»çãªå€ãé©çšããŠããå Žåã§ããé åºã¯å®éã«ã¯éèŠã§ã¯ãããŸããããïŒ è¡çªã¯ãé åºã«é¢ä¿ãªãããã®æç¹ã§ãšã©ãŒã«ãªããŸãã
- æé»ã®æ°å€ã¯ãæ¡åŒµãããæ°å€åæåã®æ倧å€ã®åŸã«1ã€ç¶ããšæããŸãã
ããããä¿å®çãªããšã¯ãã¹ãã¬ããåŸã®æåã®ã¡ã³ããŒã«æ瀺çãªå€ãèŠæ±ããããšã§ãã
åæããŸãã åæåãæ¡æ£ããå ŽåãTSã¯è¿œå ã®ã¡ã³ããŒã«æ瀺çãªå€ãé©çšããå¿ èŠããããŸãã
@ julian-sf
ãããã£ãŠããã®çšèªã®äœ¿çšã«é¢ããç§ã®èŸä»»ã¯å»¶é·ããããšèããŠãã ããð
ïŒ+1ïŒåèšã¿ã€ãä¿ååäŒã¯å芳è ããæ声ãäžããŠããŸãã
ããããèãçŽããŠã¿ããšããè¡çªãªãããšãæåŸã®1ã€ãåã€ãã®äž¡æ¹ã§ãåæåããªã¹ãã«åºããåã«åæåã¡ã³ããŒå®£èšãå ¥ããããšæãã®ã¯å¥åŠã ãšæããŸãã ããšãã°ãããããããšã§ã©ã®ãããªæå³ãäŒããããŠããã®ã§ããããã ã¹ãã¬ããã¯ãèŒžå ¥åãã«å°ã䌌ãŠãããåŸæ¥ã¯ããããäžçªââäžã«ãããŸãã
ããã¯ãã¹ãã¬ããã®ã»ãã³ãã£ã¯ã¹ã«åŸã£ãŠããå Žåã¯ãé åºãäœã§ãããã¯åé¡ã§ã¯ãªããã©ããã«ãã£ãŠç°ãªããŸãã æ£çŽãªãšãããçžäºã«æä»çãªå€ãé©çšããŠããå Žåã§ããé åºã¯å®éã«ã¯éèŠã§ã¯ãããŸããããïŒ è¡çªã¯ãé åºã«é¢ä¿ãªãããã®æç¹ã§ãšã©ãŒã«ãªããŸãã
ç§ã¯ãéåžžã®ã¡ã³ããŒå®£èšã®åŸã«ã¹ãã¬ãããé 眮ããæ£åœãªçç±ã¯ãªãããšèšã£ãŠããŸãã ãé©åãªå¶éã®äžã§ãããããååŸã«é 眮ããŠãéãã¯ãããŸããããšèšã£ãŠããŸãã ãããã®äž¡æ¹ãåæã«çå®ã§ããå¯èœæ§ããããŸãã
çµæã®äž»ãªéãã¯ãéåžžã®ã¡ã³ããŒã®åã«ã¹ãã¬ãããèš±å¯ãŸãã¯çŠæ¢ããç¯å²ã«ããããã§ãã æ§æçã«çŠæ¢ãããŠããå¯èœæ§ããããŸãã ãªã³ã¿ãŒèŠåãçºçããå¯èœæ§ããããŸãã ãŸãã¯ããã¹ãŠã®ç¹ã§å®å šã«åé¡ãªãå¯èœæ§ããããŸãã é åºã«æå³çãªéãããªãå Žåã¯ãåæåã¹ãã¬ããæ©èœãé©ãæå°ã®ååã«æºæ ããã䜿ãããããæããã説æãããããã®ãç°¡åã«ãªããŸãã
SpreadæŒç®åã䜿çšãããšãJSããã³TypeScriptå
šäœã§æµ
ãã³ããŒãåºã䜿çšãããããšã«ãªããŸãã 確ãã«ã extends
ã䜿çšãããããåºã䜿çšãããç解ããããæ¹æ³ã§ããããã¯ãçŽæ¥çãªé¢ä¿ãæå³ããŸãã ã³ã³ããžã·ã§ã³ãä»ããŠåæåãäœæããæ¹ããããç°¡åã«äœ¿çšã§ãããœãªã¥ãŒã·ã§ã³ã«ãªããŸãã
ææ¡ã®åé¿çã®ããã€ãã¯ãæå¹ã§äœ¿çšå¯èœã§ãããåãæãŸããçµæãéæããããã«ãããå€ãã®å®åã³ãŒããè¿œå ããŸãã åæåã®æçµçã§äžå€ã®æ§è³ªãèãããšãä»ã®èšèªãšäžè²«æ§ã®ããããããã£ãç¶æããããã«ãåæã«ãã£ãŠè¿œå ã®åæåãäœæããããšãæãŸããã§ãããã
ãã®äŒè©±ã§3幎ããŸã ç¶ããŠããã®ã¯æ®å¿µã§ãã
@ jmitchell38488ã³ã¡ã³ãã«ããããä»ãããã®ã§ãããæåŸã®æã§æ°ãå€ãããŸããã ææ¡ããããœãªã¥ãŒã·ã§ã³ãæ©èœãããããããã¯å¿
èŠãªè°è«ã§ãããã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ããã®ããã«æ¡åŒµããå¯èœæ§ãæå³ããŸãã ããã¯å€§ããªå€æŽã§ãããc ++ã®ãããªèšèªã®ããã°ã©ããŒãtypescriptã䜿çšããã®ãæããããå¯èœæ§ããããŸããããã¯ãåºæ¬çã«åãããšãè¡ã2ã€ã®æ¹æ³ïŒ class A extends B
ãšclass A { ...(class B {}) }
ïŒã§çµããããã§ãã ã©ã¡ãã®æ¹æ³ããµããŒãã§ãããšæããŸãããäžè²«æ§ãä¿ã€ããã«åæåã«ãextend
ãå¿
èŠã§ãã
@masak wdytïŒ ^
@sdwvitç§ã¯ãã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããã®åäœãå€æŽããããšã«ã€ããŠã¯èããŠããŸãããå ·äœçã«ã¯ãåæåã«ã€ããŠè©±ããåæãéããŠããããäœæããŠããŸãã ãããã¯äžå€ã®æçµåã§ãããããéåžžã®ç¶æ¿æ¹æ³ã§æ¡åŒµããããšã¯ã§ããŸããã
JSã®æ§è³ªãšæçµçãªãã©ã³ã¹ãã€ã«ãããå€ãèãããšãæ§æãéæã§ããªãçç±ã¯ãããŸããã 確ãã«ãåæåã§ã®äœæ¥ã¯ããé åçã«ãªããŸãã
@masak wdytïŒ ^
ããŒãã èšèªã®äžè²«æ§ã¯ç§°è³ã«å€ããç®æšã ãšæããŸãããããã£ãŠãã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ãŒã¹ã§åæ§ã®...
æ©èœãèŠæ±ããããšã¯_å
éšçã«_ééã£ãŠããŸããã ããããã±ãŒã¹ã¯åŒ±ããååšããªããšæããŸãã2ã€ã®çç±ããããŸããïŒaïŒã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãã§ã«æ¡åŒµã¡ã«ããºã ãããã2ã€ç®ã®ãã®ãè¿œå ããŠããä»å 䟡å€ã¯ã»ãšãã©ãããŸããïŒåæåã«æäŸãããšã人ã
ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒãããŸãïŒäœå¹Žãã®éããã®åé¡ã«æ»ã£ãŠããŸããïŒ; ïŒbïŒã¯ã©ã¹ã¯ããæå³ã§EcmaScriptä»æ§ããã®ãã®ã§ãããããã¯ã©ã¹ã«æ°ããæ§æãšã»ãã³ãã£ã¯ã¹ãè¿œå ãããšãæ¿èªã®åºæºãã¯ããã«é«ããªããŸãã ïŒTypeScriptã¯ES6ãããå€ãã§ãããåè
ãåŸè
ã«è¿ã¥ããããã®ç©æ¥µçãªåãçµã¿ãè¡ãããŠããŸããããã«ã¯ãè¿œå æ©èœãè¿œå ããªãããšãå«ãŸããŸããïŒ
ãã®ã¹ã¬ããã¯ãå®éã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒãã䟡å€ã®ããæ©èœã§ãããšããçç±ã ãã§é·ãééãããŠãããšæããŸãããPRã¯ãŸã äœæãããŠããŸããã ãã®ãããªPRãäœæããã«ã¯ãæ©èœãå¿ èŠã ãšèšãã ãã§ãªããæéãšåŽåãããããŸãã ïŒãŠã£ã³ã¯ïŒ
ãã®æ©èœã«åãçµãã§ãã人ã¯ããŸããïŒ
ãã®æ©èœã«åãçµãã§ãã人ã¯ããŸããïŒ
ç§ã®æšæž¬ã§ã¯ãç§ãã¡ã¯ããã«ã€ããŠã®è°è«ããçµãã£ãŠããªãã®ã§ãããïŒ
ãããã©ã®ããã«ãªããã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ã«è¿ã¥ããããã«æããŸãã ããã¯èšèªã®è¿œå ã«ãªãããããã®ææ¡ãé²ããã«ã¯ããããããã£ã³ããªã³ããå¿ èŠã«ãªããŸãã TSããŒã ã®èª°ããæ¥ãŠãåé¡ãããã£ãŒãããã¯åŸ ã¡ããããææ¡åŸ ã¡ãïŒãŸãã¯åæ§ã®ãã®ïŒã«ç§»ãå¿ èŠããããšæããŸãã
ç§ã¯ããã®ãããã¿ã€ãã«åãçµãã§ããŸãã æéã®äžè¶³ãšã³ãŒãã®æ§é ã«äžæ £ããªãããç§ã¯ããã»ã©é ããŸã§ã¯è¡ããŸããã§ãããã ç§ã¯ãããèŠæããããšæã£ãŠããŸããä»ã«åãããªããã°ãã§ããéãç¶ããŸãã
ãã®æ©èœãæ°ã«å ¥ã£ãŠããã ããã°å¹žãã§ãã 37ã¶æãçµéããŸãããããŸãããã°ããã«é²æ©ãèŠãããŸã
æè¿ã®äŒè°ããã®ã¡ã¢ïŒ
extends
ã¯ãµãã¿ã€ããæå³ããã®ã«å¯Ÿããåæåããæ¡åŒµããããšã¹ãŒããŒã¿ã€ããäœæããããããã¹ãã¬ããæ§æãæ°ã«å
¥ã£ãŠããŸãã
enum BasicEvents {
Start = "Start",
Finish = "Finish"
}
enum AdvEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
}
AdvEvents.Start
ã¯BasicEvents.Start
ãšåãã¿ã€ãIDã«è§£æ±ºããããšèããããŠããŸãã ããã¯ãã¿ã€ãBasicEvents.Start
ãšAdvEvents.Start
ãçžäºã«å²ãåœãŠå¯èœã§ãããã¿ã€ãBasicEvents
ãAdvEvents
ã«å²ãåœãŠå¯èœã§ããããšãæå³ããŸãã ãããçŽæçã«ç解ã§ããããšãé¡ã£ãŠããŸãããããã¯ãã¹ãã¬ãããåãªãæ§æäžã®ã·ã§ãŒãã«ããã§ã¯ãªãããšãæå³ããããšã«æ³šæããããšãéèŠã§ããã¹ãã¬ããããã®æå³ã®ããã«æ¡åŒµãããšã次ã®ããã«ãªããŸãã
enum BasicEvents {
Start = "Start",
Finish = "Finish"
}
enum AdvEvents {
Start = "Start",
Finish = "Finish",
Pause = "Pause",
Resume = "Resume"
}
ããã«ã¯ç°ãªãåäœããããŸããããã§ã¯ãæåååæåã®å質ãäžéæã§ããããã BasicEvents.Start
ãšAdvEvents.Start
ãçžäºã«å²ãåœãŠãããšã¯ã§ããŸããã
ãã®å®è£
ã®ãã1ã€ã®å°ããªçµæã¯ã AdvEvents.Start
ãã¯ã€ãã¯æ
å ±ã§BasicEvents.Start
ãšããŠã·ãªã¢ã«åããã宣èšãçºè¡ãããããšã§ãïŒå°ãªããšããã¡ã³ããŒãAdvEvents
ã«ãªã³ã¯ããæ§æã³ã³ããã¹ãããªãå ŽåïŒ âãªãã©ã«åŒAdvEvents.Start
ã«ã«ãŒãœã«ãåããããšã AdvEvents.Start
ãšããã¯ã€ãã¯æ
å ±ã衚瀺ãããå¯èœæ§ããããŸãããããã§ãBasicEvents.Start
ã衚瀺ããæ¹ãæ確ãªå ŽåããããŸãïŒã
ããã¯ãæåååæåã§ã®ã¿èš±å¯ãããŸãã
ãããè©ŠããŠã¿ããã§ãã
æ確ã«ããããã«ïŒããã¯å®è£ ãæ¿èªãããŠããŸããã
ããã«ã¯2ã€ã®å¯èœãªåäœããããã©ã¡ããæªãããã«èŠããŸãã
Spreadãå®éã«Spreadedenumã®ã¡ã³ããŒãã³ããŒããããšãšåãæå³ã§ããå Žåãæ¡åŒµenumã®å€ãæ¡åŒµenumã®å€ã§ãããã®ããã«äœ¿çšããããšããŠããæ©èœããªãå Žåã¯å€§ããªé©ãããããŸãã
æšå¥šããããªãã·ã§ã³ã¯ãã¹ãã¬ãããã¹ã¬ããã®äžéšè¿ãã«ãã@aj-rã®å ±çšäœã¿ã€ãã®ææ¡ã®ããã«æ©èœããããšã§ãã ããã人ã ããã§ã«æãã§ããæ¯ãèãã§ããå Žåãç解ããããããã«ãããŒãã«äžã®æ¢åã®ãªãã·ã§ã³ãå³å¯ã«æãŸããããã«æãããŸãã ãã以å€ã®å Žåã¯ãä»ã®æåååæåã®ããã«åäœããªãæ°ããçš®é¡ã®æåååæåãäœæããŠããŸããããã¯å¥åŠã§ãããã§ã®ææ¡ã®ãåçŽãããæãªãããã§ãã
人ã ã¯ã©ã®ãããªè¡åãæãã§ããŸããããããŠãã®çç±ã¯äœã§ããïŒ
ãªãã·ã§ã³1ã¯å€§ããªé©ãã«ã€ãªããã®ã§ãç§ã¯ãããæãã§ããŸããã
ãªãã·ã§ã³2ãå¿
èŠã§ããã@ aj-rã®æ¬ ç¹ãå
æããã®ã«ååãªæ§æãµããŒããå¿
èŠãªã®ã§ã圌ã®äŸããlet e: Events = Events.Pause;
ãšæžãããšãã§ããŸãã æ¬ ç¹ã¯ã²ã©ããã®ã§ã¯ãããŸããããæ¡åŒµåæåãå®è£
ãé ãããšãã§ããªãå Žæã§ãã ã ããããã¯äžçš®ã®ã°ãã¹ã§ãã
ãŸãããªãã·ã§ã³1ã¯æªãèãã ãšæããŸãã ç§ã¯èªåã®äŒç€Ÿã§ãã®åé¡ãžã®åç
§ãæ€çŽ¢ãããªã³ã¯ãããŠãã2ã€ã®ã³ãŒãã¬ãã¥ãŒãèŠã€ããŸãããã©ã¡ãã®å ŽåãïŒãããŠç§ã®å人çãªçµéšã§ã¯ïŒãå°ããåæåã®èŠçŽ ã倧ããåæåã«å²ãåœãŠãå¿
èŠãããããšã¯æããã§ãã ã ç§ã¯ç¹ã«ããã人ã...
ãå°å
¥ããŠããªãã·ã§ã³2ã®ããã«åäœãããšèãã次ã®äººãããè€éãªã±ãŒã¹ãæ©èœããªããšãã«æ¬åœã«æ··ä¹±ããïŒãŸãã¯as unknown as Events.Pause
ã®ãããªããã¯ã«é ŒãïŒããšãå¿é
ããŠããŸãã
ãªãã·ã§ã³2ã®åäœãååŸããããšããæ¹æ³ã¯ãã§ã«ãããããããŸãããã®ã¹ã¬ããã«ã¯ããããã®ã¹ããããããããããã«æååãªãã©ã«ã®åéåãå«ãããŸããŸãªã¢ãããŒãããããŸãã ãªãã·ã§ã³1ãå®è£ ããéã®ç§ã®å€§ããªå¿é ã¯ããªãã·ã§ã³2ãååŸããããã®å¥ã®ééã£ãæ¹æ³ãå¹æçã«å°å ¥ããTypeScriptã®ãã®éšåãåŠã¶äººã ã«ãšã£ãŠããå€ãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãšãã©ã¹ãã¬ãŒã·ã§ã³ã«ã€ãªããããšã§ãã
人ã ã¯ã©ã®ãããªè¡åãæãã§ããŸããããããŠãã®çç±ã¯äœã§ããïŒ
ã³ãŒãã¯èšèãããéåŒãªã®ã§ãOPã®äŸã䜿çšãããšïŒ
const BasicEvents = {
Start: "Start",
Finish: "Finish"
};
enum AdvEvents {
...BasicEvents,
Pause = "Pause", // We added a new field
Finish = "Finish2" // Oops, we actually modified a field in the parent enum
};
// The TypeScript compiler should refuse to compile this code
// But after removing the "Finish2" line,
// the TypeScript compiler should successfully handle it as one would normally expect with the spread operator
ãã®äŸã§ã¯ããªãã·ã§ã³2ã瀺ããŠããŸãã ãããããªããç§ã¯å¿ æ»ã«ãªãã·ã§ã³2ã欲ããã§ãã
ãã以å€ã®å Žåã¯ãä»ã®æåååæåã®ããã«åäœããªãæ°ããçš®é¡ã®æåååæåãäœæããŠããŸããããã¯å¥åŠã§ãããã§ã®ææ¡ã®ãåçŽãããæãªãããã§ãã
ãªãã·ã§ã³2ã¯å°ãäžå®ã§ãããäžæ©äžãã£ãŠä»£æ¿æ¡ãèããã®ãæåãããããªãããšã«åæããŸãã ããã¯ãä»æ¥ã®åæåã«æ°ããæ§æãåäœãè¿œå ããã«ãããå®è¡ããæ¹æ³ã®èª¿æ»ã§ãã
https://github.com/microsoft/TypeScript/issues/17592#issuecomment -449440944ã§ã®ç§ã®ææ¡ã¯ãæè¿æãè¿ããªããããŸãããå¯èœæ§ããããšæããŸãã
type Events = BasicEvents | AdvEvents;
const Events = {...BasicEvents, ...AdvEvents};
ãã®ã¢ãããŒãã«ã¯2ã€ã®äž»ãªåé¡ããããŸãã
Events.Pause
ãåãšããŠäœ¿çšã§ããªããããäžå®å
šã§ãã以åã httpsïŒ//github.com/microsoft/TypeScript/issues/29130ãææ¡ããŸãããããã¯ãïŒãšãããïŒ2çªç®ã®ç®æ¡æžãã«å¯ŸåŠãããã®ã§ãããããã§ã䟡å€ããããšæããŸããã確ãã«å€ãã®åŸ®åŠãªç¹ãè¿œå ãããŸããååã®ããã¿ã
äž¡æ¹ã®ç¹ã«å¯ŸåŠãããšæãæ§æã®ã¢ã€ãã¢ã®1ã€ã¯ãã¿ã€ãã宣èšãã代æ¿ã®const
æ§æã§ãã
// Declares a value and a type at the same time with the same name (just like `enum` and `class` already do).
// Requires the right-hand side to be either a unit type or an object where all values are unit types.
// The JS emit would just take out the word "type" and leave everything else.
const type Events = {...BasicEvents, ...AdvEvents};
...
const e: Events.Pause = Events.Pause;
...
// The syntax could also make this pattern more ergonomic.
const type INACCESSIBLE = "INACCESSIBLE";
const response: {name: string, favoriteColor: string} | INACCESSIBLE = INACCESSIBLE;
ããã«ãããåæåããŸã£ããå¿
èŠãªãäžçã«è¿ã¥ãããšãã§ããŸãã ïŒç§ã«ãšã£ãŠãåæåã¯ãèªæã§ã¯ãªãæŸåºåäœãæã¡ãããã©ã«ãã§åç®äžã®åŒã¬ãã«ã®æ§æã§ãããããTSèšèšã®ç®æšã«åããŠããããã«åžžã«æããŠããŸãããïŒ const type
宣èšæ§æã§ã¯ã次ã®ãããªæ§é çã«åæå®ãããæåååæåãäœæããŸãã
const type BasicEvents = {
Start: 'Start',
Finish: 'Finish',
}; // "as const" would be implicit for "const type" declarations.
確ãã«ããããæ©èœããããã«å¿
èŠãªæ¹æ³ã¯ãã¿ã€ãBasicEvents
ãtypeof BasicEvents[keyof typeof BasicEvents]
ã®çç¥åœ¢ã§ããã const type
ã®ãããªäžè¬çãªååã®æ§æã«ã¯çŠç¹ãçµãããããŠããå¯èœæ§ãããããšã§ãã ãã¶ããå¥ã®ããŒã¯ãŒãã®æ¹ãè¯ãã§ãããã ã²ã©ãconst enum
ã¯ãã§ã«åãããŠããŸãðã
ãããããïŒæååïŒåæåãšãªããžã§ã¯ããªãã©ã«ã®éã®å¯äžã®ã®ã£ããã¯èšåçåä»ãã ãšæããŸãã ããã¯ã as unique
ãconst unique type
ã®ãããªæ§æã䜿çšããŠè§£æ±ºã§ããå¯èœæ§ããããŸãããããã®æ§æã¯ãåºæ¬çã«ãããã®ãªããžã§ã¯ãã¿ã€ãã«å¯ŸããŠãçæ³çã«ã¯éåžžã®æååå®æ°ã«å¯ŸããŠãåæåã®ãããªåç®äžã®åä»ãåäœãéžæããŸãã ããã«ããã Events
ãå®çŸ©ãããšãã«ãªãã·ã§ã³1ãšãªãã·ã§ã³2ã®ã©ã¡ãããæ確ã«éžæã§ããŸãã Events
ãå®å
šã«ç°ãªãã¿ã€ãïŒãªãã·ã§ã³1ïŒã«ããå Žåã¯ã unique
ã䜿çšããŸãã Events
ãšBasicEvents
ã®éã®å²ãåœãŠå¯èœæ§ãå¿
èŠãªå Žåã¯ã unique
ãçç¥ããŸãïŒãªãã·ã§ã³2ïŒã
const type
ãšconst unique type
ã䜿çšãããšãæ¢åã®åæåããããã«çµåããæ¹æ³ãšãåæåã1åéãã§ã¯ãªãTSæ©èœã®èªç¶ãªçµã¿åãããšããŠè¡šçŸããæ¹æ³ããããŸãã
ããã§äœãèµ·ãã£ãŠããã®ã§ããïŒ ð
2017幎ãããããð€ªããã以äžã®ãã£ãŒãããã¯ãå¿ èŠã§ããïŒ
ãã以äžã®ãã£ãŒãããã¯ãå¿ èŠã§ããïŒ
ããã§??? ææ¡ã¯å€ãã®ã§ãå®è£ ããã ãã§ã¯ãããŸããã
ãã以äžã®ãã£ãŒãããã¯ãå¿ èŠã§ããïŒ
ããã§??? ææ¡ã¯å€ãã®ã§ãå®è£ ããã ãã§ã¯ãããŸããã
ã¯ãã ã©ã¡ãã®æ¹åãããããŸããã§ããã
ããäžåºŠèªãã§ïŒ40998ãèŠãã®ãæåã®æ¹æ³ã ãšæããŸã...åæåã¯ãªããžã§ã¯ãã§ãããã¹ãã¬ããã¯åæåãããŒãž/æ¡åŒµããæ¹ãç°¡åã ãšæããŸãã
èšèªãã¶ã€ã³ã«ã€ããŠæèŠãè¿°ã¹ãã®ã«ååãªè³æ Œã¯ãªããšæããŸãããéåžžã®éçºè ãšããŠãã£ãŒãããã¯ãæäŸã§ãããšæããŸãã
ãã®æ©èœã䜿çšãããã£ãå®éã®ãããžã§ã¯ãã§ãæ°é±éåã«ãã®åé¡ã«ééããŸããã ç§ã¯@alangpierceã®ã¢ãããŒãã䜿çšããããšã«ãªããŸããã æ®å¿µãªãããéçšäž»ã«å¯Ÿããç§ã®è²¬ä»»ã®ãããããã§ã³ãŒããå ±æããããšã¯ã§ããŸããããããã«ããã€ãã®ãã€ã³ãããããŸãã
å šäœãšããŠãéå±ãªããžãã¹ããžãã¯ãæã€å®éã®ãããžã§ã¯ãã®å€ãã¯ããã®æ©èœããå€ãã®å©çãåŸããšæããŸãã åæåãç°ãªããµãã¿ã€ãã«åå²ãããšãåã·ã¹ãã ã¯ãåäœãã¹ãã§ãã§ãã¯ãããå€ãã®äžå€æ¡ä»¶ããã§ãã¯ã§ããããã«ãªããŸããåã·ã¹ãã ã§èª€ã£ãå€ãè¡šçŸã§ããªãããã«ããããšã¯ãåžžã«è¯ãããšã§ãã
ããã
ããã«ç§ã®2ã»ã³ããè¿œå ããŸãããð
tsoaã§çæãããOpenApiããã¥ã¡ã³ããå«ãAPIããããŸãã
ç§ã®ã¢ãã«ã®1ã€ã«ã¯ã次ã®ããã«å®çŸ©ãããã¹ããŒã¿ã¹ããããŸãã
enum EntityStatus {
created = 'created',
started = 'started',
paused = 'paused',
stopped = 'stopped',
archived = 'archived',
}
ãããã®ã¹ããŒã¿ã¹ã®ãµãã»ãããååŸããã¡ãœããsetStatus
ããããŸãã ãã®æ©èœã¯å©çšã§ããªããããåæåã次ã®ããã«è€è£œããããšãæ€èšããŸããã
enum RequestedEntityStatus {
started = 'started',
paused = 'paused',
stopped = 'stopped',
}
ãããã£ãŠãç§ã®æ¹æ³ã¯æ¬¡ã®ããã«èª¬æãããŸãã
public setStatus(status: RequestedEntityStatus) {
this.status = status;
}
ãã®ã³ãŒãã§ãç§ã¯ãã®ãšã©ãŒãåãåããŸãïŒ
Conversion of type 'RequestedEntityStatus' to type 'EntityStatus' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.
ä»ã®ãšãããããè¡ããŸãããèå³ãããããããèŠã€ãããšãã«ãã®ãªããžããªãæ€çŽ¢ãå§ããŸããã
äžçªäžãŸã§ã¹ã¯ããŒã«ããåŸããã®ãŠãŒã¹ã±ãŒã¹ã瀺åãã人ã¯èª°ãèŠã€ãããŸããã§ããïŒãŸãã¯äœããèŠéããå¯èœæ§ããããŸãïŒã
ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãEntityStatusãRequestedEntityStatusã®æ¡åŒµã§ããçç±ããªããããåæåãããæ¡åŒµãããããããŸããã ããäžè¬çãªåæåãããéžæãã§ããããã«ããããšæããŸãã
ã¹ãã¬ããæŒç®åã¯æ¡åŒµææ¡ãããåªããŠããããšãããããŸããããããã«é²ãã§ããããææ¡ããããšæããŸãã
enum EntityStatus {
created = 'created',
started = 'started',
paused = 'paused',
stopped = 'stopped',
archived = 'archived',
}
enum RequestedEntityStatus {
// Pick/Reuse from EntityStatus
EntityStatus.started,
EntityStatus.paused,
EntityStatus.stopped,
}
// Fake enum, just to demonstrate
enum TargetStatus {
{...RequestedEntityStatus},
// Why not another spread here?
//{...AnotherEnum},
EntityStatus.archived,
}
public class Entity {
private status: EntityStatus = 'created'; // Why not a cast here, if types are compatible, and deserializable from a JSON. EntityStatus would just act as a type union here.
public setStatus(requestedStatus: RequestedEntityStatus) {
if (this.status === (requestedStatus as EntityStatus)) { // Should be OK because types are compatible, but the cast would be needed to avoid comparing oranges and apples
return;
}
if (requestedStatus == RequestedStatus.stopped) { // Should be accessible from the enum as if it was declared inside.
console.log('Stopping...');
}
this.status = requestedStatus;// Should work, since EntityStatus contains all the enum members that RequestedEntityStatus has.
}
public getStatusAsStatusRequest() : RequestedEntityStatus {
if (this.status === EntityStatus.created || this.status === EntityStatus.archived) {
throw new Error('Invalid status');
}
return this.status as RequestedEntityStatus; // We have eliminated the cases where the conversion is impossible, so the conversion should be possible now.
}
}
ããäžè¬çã«ã¯ãããã¯æ©èœããã¯ãã§ãã
enum A { a = 'a' }
enum B { a = 'a' }
const a:A = A.a;
const b:B = B.a;
console.log(a === b);// Should not say "This condition will always return 'false' since the types 'A' and 'B' have no overlap.". They do have overlaps
åæåã®å¶çŽãç·©åããŠãäžéæãªæ§é ããããŠããªã³ïŒ
'a' | 'b'
ïŒã®ããã«åäœãããããšæããŸãã
ãããã®ã¢ããªãã£ãã³ã³ãã€ã©ã«è¿œå ããããšã«ãããåãå€ãæã€2ã€ã®ç¬ç«ããåæåãããŠããªã³ãšåãã«ãŒã«ã§çžäºã«å²ãåœãŠãããšãã§ããŸãã
次ã®åæåãäžããããŸãïŒ
enum A { a = 'a', b = 'b' }
enum B { a = 'a' , c = 'c' }
enum C { ...A, c = 'c' }
ãããŠã3ã€ã®å€æ°a:A
ã b:B
ã c:C
c = a
ã¯æ©èœããã¯ãã§ãããããã£ãŠãAã®ãã¹ãŠã®å€ã¯Cã®æå¹ãªå€ã§ããc = b
ã¯æ©èœããã¯ãã§ããããã¯ãBã'a' | 'c'
ã§ãããã©ã¡ããCã®æå¹ãªå€ã§ããããã§ããb = a
ã¯ã a
ã'b'
ãšç°ãªãããšãããã£ãŠããå Žåã«æ©èœããŸãïŒããã¯ã¿ã€ã'a'
ã®ã¿ã«çžåœããŸãïŒa = b
ã¯ã b
ã'c'
ãšç°ãªãããšãããã£ãŠããå Žåã«æ©èœããŸããb = c
ã¯ã c
ã'b'
ãšç°ãªãããšãããã£ãŠããå Žåã«æ©èœããŸãïŒããã¯'a'|'c'
ã«çãããããã¯ãŸãã«Bã§ãïŒãŸãã¯ãçåŒã®æ¯èŒã«é¢ããŠã¯ãå³åŽã«æ瀺çãªãã£ã¹ããå¿ èŠãªå ŽåããããŸããïŒ
ã¹ãã¬ããæŒç®åã§èªç¶ã«æãããšããŠããç§ã¯ãæåŸã®åå©ãã«ãŒã«ã®ãã¡ã³ã§ã¯ãããŸããã
ããŒãšå€ã®äž¡æ¹ãåäžã§ãªãéããåæåã®ãããŒããŸãã¯ãå€ãã®ãããããéè€ããŠããå Žåãã³ã³ãã€ã©ã¯ãšã©ãŒãè¿ãå¿
èŠããããŸãã
enum A { a = 'a', b = 'b' }
enum B { a = 'a' , c = 'c' }
enum C {...A, ...B } // OK, equivalent to enum C { a = 'a', b = 'b', c = 'c' }, a is deduplicated
enum D {...A, a = 'd' } // Error : Redefinition of a
enum E {...A, d = 'a' } // Error : Duplicate key with value 'a'
ãã®ææ¡ã¯ãTSéçºè
ãäœæ¥ããã®ã«éåžžã«æè»ã§èªç¶ã§ãããåæåãå®éã«å€æŽããããšãªããããå€ãã®åå®å
šæ§ïŒ as unknown as T
ãšæ¯èŒããŠïŒãå¯èœã«ããŸãã åæåã«ã¡ã³ããŒãè¿œå ããæ°ããæ¹æ³ãšãåæåãçžäºã«æ¯èŒããæ°ããæ¹æ³ã玹ä»ããã ãã§ãã
ã©ãæããŸããïŒ ãã®æ©èœãå®çŸã§ããªãæãããªèšèªã¢ãŒããã¯ãã£ã®åé¡ãèŠéããŸãããïŒ
æãåèã«ãªãã³ã¡ã³ã
ãã¹ãŠã®åé¿çã¯çŽ æŽãããã§ãããå¯èœãªéãåçŽãªåŸ¹åºçãªãã§ãã¯ã䜿çšã§ããããã«ãtypescriptèªäœããã®åæåç¶æ¿ã®ãµããŒãã確èªããããšæããŸãã