묞ììŽ êž°ë° ìŽê±°í ìŽì ìë ë§ì ê²ë€ìŽ ê°ì²Žë¡ ë첎ëììµëë€. ê°ì²Žë¥Œ ì¬ì©íë©Ž ì íì íì¥í ìë ììµëë€. ì륌 ë€ìŽ:
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 ì첎ìì ìŽê±°í ìì ì§ìì ë³Žê³ ì¶ìµëë€.
enum ëì class륌 ì¬ì©íììì€.
ëë ìŽê²ì ìëíê³ ììë€.
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ëª ìŽìì ì¬ëë€ - ê·žê²ì ë¹ì°í ìŒìž ê² ê°ìµëë€.
ë€ìì€íìŽì€ì ë€ë¥ž íìŒìì enumì ë€ì ëŽë³ŽëŽë ê²ì¡°ì°š enum ì íì¥íì§ ìê³ ë ì ë§ ìŽìí©ëë€.
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
ê° ì€ì ë¡ ë ë§ì _copying_ ì믞륌 ê°ê³ ìë€ë ë»ìžê°ì? ( A
ìì B
$ ë¡ì ìŽê±°í ê°)? ê·žë¬ë©Ž ì€ìì¹ê° ì ìì ìŒë¡ ëìµëë€.
ê·žë¬ë ì¬ì í ëìê² ê¹šì§ ê²ì²ëŒ 볎ìŽë _ìŒë¶_ êž°ëê° ììµëë€. ê·žê²ì íì€í íêž° ìí ë°©ë²ìŒë¡: íŽëì€ìì extends
ë ë³µì¬ ì믞륌 ì ë¬íì§ _ììµëë€_ â íëì ë©ìëë íì¥ íì íŽëì€ì ë³µì¬ëì§ ììµëë€. ëì íë¡í íì
첎ìžì íµíŽ ì¬ì©í ì ììµëë€. ìíŒ íŽëì€ìë íë ëë ë©ìëê° íëë§ ììµëë€.
ìŽ ë묞ì class B extends A
ìŽë©Ž B
ê° A
ì í ë¹ ê°ë¥íë¯ë¡ ì륌 ë€ìŽ let a: A = new B();
ê° ì벜í ê²ì
ëë€.
ê·žë¬ë ìŽê±°í ë° extends
륌 ì¬ì©íë©Ž íŽë¹íë 볎ì¥ìŽ ìêž° ë묞ì let a: A = B.b;
륌 ìíí ì ììµëë€. ê·žê²ìŽ ëìê² ìŽìíê² ë껎ì§ë ê²ì
ëë€. ì¬êž°ì extends
ë ìíí ì ìë ìì
ì ëí í¹ì ê°ì ì§í©ì ì ë¬íë©° ìŽê±°í곌 ìŒì¹íì§ ììµëë€.
ê·žë° ë€ì expands
ëë clones
? ð€·ââïž
ì¬ì©ìì êŽì ìì 볌 ë Ʞ볞ì ìž ê²ìŽ ë¬ì±íêž° ìœì§ ìì ê²ìŽ ìŽìíê² ë껎ì§ëë€.
í©ëŠ¬ì ìž ì믞 첎ê³ì ìì í ìë¡ìŽ í€ìëê° íìí 겜ì°(ë€ë¥ž ìžìŽì ì í êž°ì ìŽ ê±°ì ìì) OP ë° ìŽ ì£Œì ìì ì ìí ëë¡ íì° êµ¬ë¬ž( ...
)ì ëì ì¬ì©íì§ ìë ìŽì ë 묎ìì
ëê¹?
+1
ìŽê²ìŽ Ʞ볞 ìŽê±° êž°ë¥ì ì¶ê°ëꞰ륌 ë°ëëë€. :)
ë구ë ì§ ì°ìí ì룚ì ì ìê³ ììµëê¹ ??? ð§
í©ëŠ¬ì ìž ì믞 첎ê³ì ìì í ìë¡ìŽ í€ìëê° íìí 겜ì°(ë€ë¥ž ìžìŽì ì í êž°ì ìŽ ê±°ì ìì) OP ë° ìŽ ì£Œììì ì ìí ëë¡ ì€íë ë 구묞(...)ì ëì ì¬ì¬ì©íì§ ìë ìŽì ë 묎ìì ëê¹?
ë€, ì¡°êž ë ìê°íŽë³ž 결곌 ìŽ ââì룚ì ìŽ ì¢ì ê² ê°ìµëë€.
ìŽ ì 첎 묞ì ì€ë ë륌 ìœì í, ì€íë ë ì°ì°ì륌 ì¬ì¬ì©íë©Ž 묞ì ê° íŽê²°ëê³ êµ¬ë¬žì íŒë/ì§êŽì ìŽì§ ìê² ë§ëë ê²ì ëíŽ ì¬ëë€ìŽ ì êž°í 몚ë ì°ë €ë¥Œ íŽê²°íë€ë êŽë²ìí ëìê° ìë ê²ìŒë¡ 볎ì ëë€.
// extend enum using spread
enum AdvancedEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
};
ìŽ ë¬žì ì ì¬ì í @RyanCavanaugh ëŒë "ì¶ê° íŒëë°± ëêž° ì€" ë ìŽëžìŽ íìí©ëê¹?
ìíë êž°ë¥ +1
ìŽ ë¬žì ì ëí ìììŽ ììµëê¹? ìŽê±°íì ëíŽ íì° ì°ì°ì륌 구ííë ê²ì ì ë§ ì ì©í©ëë€.
í¹í ë©ííë¡ê·žëë°ê³Œ êŽë šë ì¬ì© ì¬ë¡ì ê²œì° ìŽê±°íì ë³ì¹ìŒë¡ ì§ì íê³ íì¥íë êž°ë¥ì íìí곌 ììŒë©Ž ì¢ì ê² ì¬ìŽì ììµëë€. ììì ìžêží íŽê²° ë°©ë² ì€ íëì ìì¡Žíì§ ìë í íì¬ íëì ìŽê±°íì ë€ë¥ž ìŽëŠìŒë¡ export
ì¬ì©í ì ìë ë°©ë²ìŽ ììµëë€.
@m93a ì, ê·žëì ì¬êž°ì
extends
ê° ì€ì ë¡ ë ë§ì _copying_ ì믞륌 ê°ê³ ìë€ë ë»ìžê°ì? (A
ììB
$ ë¡ì ìŽê±°í ê°)? ê·žë¬ë©Ž ì€ìì¹ê° ì ìì ìŒë¡ ëìµëë€.ê·žë¬ë ì¬ì í ëìê² ê¹šì§ ê²ì²ëŒ 볎ìŽë _ìŒë¶_ êž°ëê° ììµëë€. ê·žê²ì íì€í íêž° ìí ë°©ë²ìŒë¡: íŽëì€ìì
extends
ë ë³µì¬ ì믞륌 ì ë¬íì§ _ììµëë€_ â íëì ë©ìëë íì¥ íì íŽëì€ì ë³µì¬ëì§ ììµëë€. ëì íë¡í íì 첎ìžì íµíŽ ì¬ì©í ì ììµëë€. ìíŒ íŽëì€ìë íë ëë ë©ìëê° íëë§ ììµëë€.ìŽ ë묞ì
class B extends A
ìŽë©ŽB
ê°A
ì í ë¹ ê°ë¥íë¯ë¡ ì륌 ë€ìŽlet a: A = new B();
ê° ì벜í ê²ì ëë€.ê·žë¬ë ìŽê±°í ë°
extends
륌 ì¬ì©íë©Ž íŽë¹íë 볎ì¥ìŽ ìêž° ë묞ìlet a: A = B.b;
륌 ìíí ì ììµëë€. ê·žê²ìŽ ëìê² ìŽìíê² ë껎ì§ë ê²ì ëë€. ì¬êž°ìextends
ë ìíí ì ìë ìì ì ëí í¹ì ê°ì ì§í©ì ì ë¬íë©° ìŽê±°í곌 ìŒì¹íì§ ììµëë€.
@masak ëë ë¹ì ìŽ ì íì ê°ê¹ë€ê³ ìê°íì§ë§ íëì ìì ê°ì ìŽ ì못ëììµëë€. 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 íë ìŽê·žëŒìŽë ë§í¬
ê°ëší ë§íŽì, ëë extends ISê° ì íí ìíëê³ ìë ì íí ì©ìŽëŒê³ 믿ìµëë€. enum B extends A
ìì ìì B ìŽê±°íì A ìŽê±°íì ê°ë¥í 몚ë ê°ì í¬íší ê²ìŽëŒê³ íì êž°ëí ì ììµëë€. Aìê² í ë¹í ì ììµëë€.
ê·žëì ì ë ìë¡ìŽ í€ìëê° íìíì§ ìë€ê³ ìê°í©ëë€. extends륌 ì¬ì©íŽìŒ íë€ê³ ìê°í©ëë€. ê·žëŠ¬ê³ ìŽê²ìŽ Ʞ볞ì ìŒë¡ TypeScriptì ìŒë¶ì¬ìŒ íë€ê³ ìê°í©ëë€ :D
@julian-sf ëë ë¹ì ìŽ ìŽ ëªšë ê²ì ëìíë€ê³ ìê°í©ëë€ ...
...íì§ë§... :ìœê°_ìë_ìŒêµŽ:
ì¬êž°ì 묞ì 륌 ì êž°í ê²ì²ëŒ ìŽ ìí©ì ìŽë»ìµëê¹?
// example from OP
enum BasicEvents {
Start = "Start",
Finish = "Finish"
};
// extend enum using "extends" keyword
enum AdvEvents extends BasicEvents {
Pause = "Pause",
Resume = "Resume"
};
Pause
ê° AdvEvents
#$ ì _instance_ìŽê³ AdvEvents
_extens_ BasicEvents
ìž ê²œì° Pause
ë BasicEvents
#ì _instance_ê° ë ê²ìŒë¡ ììíìê² ìµëê¹?
ë°ë©Žì ìŽê±°í(IMHO)ì íµì¬ ê°ì¹ ì ìì switch
묞곌 ê°ì ê²ìŽ ì 첎ì±ì ê°ì í ì ìëë¡ ìŽê±°íìŽ _closed_/"ìµì¢
"(íì¥ ë¶ê°)ìŽëŒë ê²ì
ëë€. (ë°ëŒì AdvEvents
ê° BasicEvent
ê° ëë€ë ì믞륌 _extend__ í ì ìë€ë ê²ì enumì ëí ìŒì¢
ì Least Surprise륌 ìë°íë ê²ì
ëë€.)
ë€ì ìž ê°ì§ ìì± ì€ ë ê° ìŽìì ì¬ì©í ì ìë€ê³ ìê°í©ëë€.
enum
ì ìž ê°ì extends
êŽê³b
ê° B
ë° B extends A
ì ìžì€íŽì€ìŽë©Ž b
ê° A
ì ìžì€íŽì€ëŒë (í©ëŠ¬ì ìž) ê°ì @masak ëë enumì íìí ìì¹(ë°íì ì)ì ìŽíŽíê³ ëìí©ëë€. ê·žë¬ë 컎íìŒ ìê° íì¥ì 몚ë 컎íìŒë¬ì ìíŽ ì ì ë° êµ¬ì±ëë¯ë¡ ë°íì ì íì ìì¹ì ìë°íì§ ììµëë€.
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
í€ìë륌 ê±°ì³ìŒ íì§ë§ ìŽê²ìŽ ëŽë¶ì ìŒë¡ ë°ìí©ëë€.) ìŽê²ì ëí ì¢ì ì ì ìŽê±°íìŽ íŽëì€ê° íë 몚ë ížì륌 ì»ëë€ë ê²ì
ëë€. íë, ìì±ì, ë©ìë륌 ê°ì§ ì ììµëë€... ìŽ ì ê·Œ ë°©ììì ìŽê±°í ë©€ë²ë _are_ ìžì€íŽì€ì
ëë€. (JLSë ê·žë ê² ë§í©ëë€.)
TypeScript ìŽê±° ì믞 첎ê³ì ëí ë³ê²œì ì ìíì§ ììµëë€. í¹í TypeScriptê° ìŽê±°íì ëíŽ Java 몚ëžì ì¬ì©íëë¡ ë³ê²œëìŽìŒ íë€ê³ ë§íë ê²ìŽ ìëëë€. ìŽê±°í/ìŽê±°í ë©€ë² ìì íŽëì€/ìžì€íŽì€ "ìŽíŽ"륌 ì€ë²ë ìŽíë ê²ìŽ ì ìµíê³ íµì°°ë ¥ìŽ ìë€ë _am_ì ëë€. "enum _is_ class" ëë "an enum member _is_ instance"ê° ìëëŒ... íì§ë§ ìŽìëë ì ì¬ì ìŽ ììµëë€.
ìŽë€ ì ì¬ì ? 뚌ì íìê°ì ì ì ë ¥í©ëë€.
enum Foo { A, B, C }
enum Bar { X, Y, Z }
let foo: Foo = Foo.C;
foo = Bar.Z;
Bar.Z
ê° Foo
ìŽ ìëêž° ë묞ì ë§ì§ë§ ì€ì typecheck íì§ ììµëë€. ë€ì ë§íì§ë§, ìŽê²ì _ì€ì ë¡ë_ íŽëì€ ë° ìžì€íŽì€ê° ìëì§ë§ Foo
ë° Bar
ê° íŽëì€ìŽê³ 6ëª
ì ë©€ë²ê° ê°ê°ì ìžì€íŽì€ìž ê²ì²ëŒ ëìŒí 몚ëžì ì¬ì©íì¬ _ìŽíŽ_í ì ììµëë€.
(ìŽ ìžìì 목ì ì ìíŽ let foo: Foo = 2;
ë ì믞ì í©ë²ì ìŽê³ ìŒë°ì ìŒë¡ number
ê°ì ìŽê±°í ì íì ë³ìì í ë¹í ì ìë€ë ì¬ì€ì 묎ìí©ëë€.)
ìŽê±°íìë _closed_ëŒë ì¶ê° ìì±ìŽ ììµëë€. ì£ì¡í©ëë€. ìŽì ëí ë ëì ì©ìŽë ëªšë¥Žê² ìµëë€. ìŒëš ì ìíë©Ž íì¥í ì ììµëë€. í¹í ìŽê±°í ì ìž ëŽë¶ì ëìŽë ë©€ë²ë ìŽê±°í ì í곌 ì íìŽ ìŒì¹íë _only_ í목ì
ëë€. ("íì ìžê³ ê°ì€"ììì ê°ìŽ "ë«í".) ìŽê±°íì switch
묞ì ìë 몚ë ì¬ë¡ê° í¬íšëìëì§ ìì í íì€íê² íìží ì ìêž° ë묞ì ìŽê²ì íë¥í ìì±ì
ëë€.
ìŽê±°íì extends
륌 ì¬ì©íë©Ž ìŽ ìì±ìŽ ì°œ ë°ìŒë¡ ì¬ëŒì§ëë€.
ë¹ì ì ì°êž°,
ìŽê±°íì íì ìì¹(ë°íì ì)ì ìŽíŽíê³ ëìí©ëë€. ê·žë¬ë 컎íìŒ ìê° íì¥ì 몚ë 컎íìŒë¬ì ìíŽ ì ì ë° êµ¬ì±ëë¯ë¡ ë°íì ì íì ìì¹ì ìë°íì§ ììµëë€.
ìŽê±°íì íì¥íë 몚ë ìœëê° íë¡ì ížì ìë€ê³ ê°ì íêž° ë묞ì ê·žê²ìŽ ì¬ì€ìŽ ìëëŒê³ ìê°í©ëë€. ê·žë¬ë íì¬ ëªšëìŽ ìŽê±°íì íì¥í ì ììŒë©° ê°ìêž° 컎íìŒíë ìœëì ì ìŽë¥Œ ë²ìŽë ìŽê±°íì í ë¹í ì ìë _new_ ìŽê±°í ë©€ë²ê° ììµëë€. Ʞ볞ì ìŒë¡ ìŽê±°íì 컎íìŒ íììë ë ìŽì ë«íì§ ììµëë€.
ëë ì¬ì í ëŽê° ì믞íë ë°ë¥Œ ì ííê² íííë ë° ë€ì ìíŽë€ê³ ìê°íì§ë§, ê·žê²ìŽ ì€ìíë€ê³ ìê°í©ëë€. $# enum
ì extends
ë ìŽê±°íì ê°ì¥ ìì€í êž°ë¥ ì€ íë륌 깚ëšëŠŽ ê²ì
ëë€. ë€ì íì. ë°ë¡ ìŽë¬í ìŽì ë¡ ìŽê±°íì íì¥/íì ë¶ë¥íë ê²ì ì ëì ìŒë¡ _êžì§_íë ìžìŽê° ëª ê°ìžì§ ê³ì°íììì€.
íŽê²° ë°©ë²ì ëíŽ ì¡°êž ë ìê°íê³ #17592 (comment) , ê° ê³µê°ì
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ìì, ê·žë¬ë ê·ž í ë ë² ë€ì ì ìëš)ì ìë €ì§ ë¬žì ììŽ ëªšë륌 íë³µíê² ë§ë€ ê²ì ëë€.
// extend enum using spread
enum AdvEvents {
...BasicEvents,
Pause = "Pause",
Resume = "Resume"
};
extends
륌 ì¬ì©íì§ ìê³ _ììŽ_ ìŽ ì ì©íŽ 볎ìŽë "ìŽ ë€ë¥ž ìŽê±°íì 몚ë 구ì±ì ë³µì " êž°ë¥ì 구ííë ê²ì ì믞íêž° ë묞ì _me_ë íë³µí ê²ì
ëë€. ...
구묞ì íì¥ìŽ ìë ë³µì¬ë¥Œ íµíŽ ìŽë¬í 묞ì 륌 ë°©ì§í©ëë€.
ìŽ ë¬žì ë ì¬ì í "ì¶ê° íŒëë°± ëêž° ì€"ìŒë¡ íìëìŽ ììŒë©°, íìíë€ê³ ëëŒë ëì íŽë¹ ë²ì£Œì íŽë¹ í목ì ì ì§í ì ìë íµì¬ 구ì±ìì ê¶ëŠ¬ë¥Œ ì¡Žì€í©ëë€. ê·žë¬ë ëí ìì ì¬íì 구ííê³ PRë¡ ì ì¶íë ê²ì ë§ì ì ìë ë°©ë²ì ììµëë€.
@masak ë ëµë³ ê°ì¬í©ëë€. ìŽì 몚ë í ë¡ êž°ë¡ì ìŽíŽëŽìŒ í©ëë€. ìŽíì ë€ì ì°ëœëëŠ¬ê² ìµëë€ :)
ëë ìŽê²ìŽ ìŒìŽëë ê²ì ì ëì ìŒë¡ ë³Žê³ ì¶ê³ ìŽê²ì ì§ì 구ííë €ê³ ìëíë ê²ì ì ëì ìŒë¡ ì¢ìí ê²ì ëë€. ê·žë¬ë ì¬ì í 몚ë ìŽê±°íì ëí ëìì ì ìíŽìŒ í©ëë€. ìŽ ëªšë ê²ì 묞ììŽ êž°ë° ìŽê±°íì ëíŽ ì ìëíì§ë§ ë°ëëŒ ì«ì ìŽê±°íì ìŽë»ìµëê¹? ì¬êž°ìì íì¥/ë³µì¬ë ìŽë»ê² ìëí©ëê¹?
"ëìŒí ì í" ìŽê±°í(ì«ìë ì«ì íì¥, 묞ììŽ íì¥ ë¬žììŽ)ë¡ ìŽê±°í íì¥ë§ íì©íê³ ì¶ë€ê³ ê°ì í©ëë€. ìŽêž°ì¢ ìŽê±°í ì êž°ì ì ìŒë¡ ì§ìëë¯ë¡ ê·ž ì§ìì ì ì§íŽìŒ íë€ê³ ìê°í©ëë€.
ì¬ë¬ ìŽê±°íìì íì¥ì íì©íŽìŒ í©ëê¹? ê·žê²ë€ì 몚ë ìíž ë°°íì ìž ê°ì¹ë¥Œ ê°ì žìŒ í©ëê¹? ìëë©Ž ê²¹ì¹ë ê°ì íì©í©ëê¹? ìŽí ììì ë°ë¥ž ì°ì ìì?
íì¥ ìŽê±°íìŽ íì¥ ìŽê±°í ê°ì ì¬ì ìí ì ììµëê¹?
íì¥ë ìŽê±°íìŽ ê° ëª©ë¡ì ìììŒë¡ ëíëìŒ í©ëê¹ ìëë©Ž ììì ììë¡ ìì ì ììµëê¹? ëì€ì ì ìë ê°ìŽ ë ëì ì°ì ìì륌 ê°ëë€ê³ ê°ì í©ëê¹?
ììì ì«ì ê°ì íì¥ ì«ì ìŽê±°íì ìµëê° ìŽíì ê³ì 1ìŽëŒê³ ê°ì í©ëë€.
ë¹íž ë§ì€í¬ì ëí í¹ë³í ê³ ë € ì¬í?
ë± ë±
@JeffreyMercado ìŽê²ì ì¢ì ì§ë¬žìŽë©° 구íì ìëíë €ë ì¬ëìê² ì í©í©ëë€. :ìë€:
ìëë "볎ìì ìž" ëììž ì ê·Œ ë°©ìì ë°ëŒ ìëŽë ëŽ ëµë³ì ëë€("ìŽì ë²ì 곌ì ížíì±ì ì ì§íë©Žì ëì€ì ë³ê²œíêž° ìŽë €ìŽ ì§êž ì íì íêž°ë³Žë€ íì€íì§ ìì 겜ì°ë¥Œ íì©íì§ ìë ëììž ê²°ì ì ëŽëŠ¬ì").
- "ê°ì ì í" ìŽê±°íìŒë¡ ìŽê±°íì íì¥íë ê²ë§ íì©íë€ê³ ê°ì í©ëë€(ì«ìë ì«ì íì¥, 묞ììŽ íì¥ ë¬žììŽ)
ì ë ê·žë ê² ìê°í©ëë€. íŒí© ì íì 결곌 ìŽê±°íì ê·žë€ì§ ì ì©íì§ ìì ê² ê°ìµëë€.
- ì¬ë¬ ìŽê±°íìì íì¥ì íì©íŽìŒ í©ëê¹? ê·žê²ë€ì 몚ë ìíž ë°°íì ìž ê°ì¹ë¥Œ ê°ì žìŒ í©ëê¹? ìëë©Ž ê²¹ì¹ë ê°ì íì©í©ëê¹? ìŽí ììì ë°ë¥ž ì°ì ìì?
ì°ëŠ¬ê° ë§íë ì믞 첎ê³ë¥Œ ë³µì¬íêž° ë묞ì ì¬ë¬ ìŽê±°íì ë³µì íë ê²ìŽ C++ìì ë€ì€ ììë³Žë€ "ë êŽì°®ì" ê²ì²ëŒ 볎ì
ëë€. í¹í ê°ì²Ž íì°ì ì ì¶ë¥Œ ê³ì 구ì¶íë©Ž 묞ì ê° ë°ìíì§ ììµëë€. let newEnum = { ...enumA, ...enumB };
몚ë 구ì±ììŽ ìíž ë°°íì ìž ê°ì¹ë¥Œ ê°ì žìŒ í©ëê¹? 볎ìì ìž ê²ì "ì"ëŒê³ ë§íë ê²ì ëë€. ë€ì ë§íì§ë§, ê°ì²Ž íì°ì ë¹ì ë ì°ëŠ¬ìê² ëìì ìž ì믞륌 ì ê³µí©ëë€: ë§ì§ë§ ê²ìŽ ìŽê¹ëë€.
ìŽê±°í ê°ì ì¬ì ìí ì ìë ì¬ì© ì¬ë¡ë¥Œ ìê°í ì ììµëë€. íì§ë§ 귞걎 ì ììë ¥ ë¶ì¡±ìŒ ìë ììŽì. 충ëì íì©íì§ ìë 볎ìì ìž ì ê·Œ ë°©ìì ì€ëª /ëŽë¶ííêž° ìœê³ ì ìŽë ìŽë¡ ì ì€ì ëììž ì€ë¥(ì ì í ìœë ëë ì ì§ êŽëŠ¬ ì€ìž ìœëìì)륌 ë žì¶í ì ìë€ë ìŠê±°ìŽ ìì±ì ê°ì§ê³ ììµëë€.
- íì¥ ìŽê±°íìŽ íì¥ ìŽê±°í ê°ì ì¬ì ìí ì ììµëê¹?
ëë ëëµê³Œ ì¶ë¡ ìŽ ìŽì ì 겜ì°ì ë§ì°¬ê°ì§ë¡ ìŽ ê²œì°ìë ê±°ì ê°ë€ê³ ìê°í©ëë€.
- íì¥ë ìŽê±°íìŽ ê° ëª©ë¡ì ìììŒë¡ ëíëìŒ í©ëê¹ ìëë©Ž ììì ììë¡ ìì ì ììµëê¹? ëì€ì ì ìë ê°ìŽ ë ëì ì°ì ìì륌 ê°ëë€ê³ ê°ì í©ëê¹?
ëë ì°ì ìŽê²ìŽ "ë§ì§ë§ìŽ ìŽêž°ë€"ëŒë ì믞ì ì¬ì ì륌 ì¬ì©íë 겜ì°ìë§ ì€ìíë€ê³ ë§íë €ê³ íìµëë€.
ê·žë¬ë ë€ì ìê°íŽ 볎멎 "충ë ìì"곌 "ë§ì§ë§ìŽ ì¹ëŠ¬" 몚ëìì ìŽê±°íìŽ ëª©ë¡ì íŒì§êž° ì ì ìŽê±°í ë©€ë² ì ìžì _ìíë_ ê²ì¡°ì°š ìŽìíë€ê³ ìê°í©ëë€. ì륌 ë€ìŽ, ê·žë ê² íšìŒë¡ìš ìŽë€ ìëê° ì ë¬ëê³ ììµëê¹? ì€íë ëë "ìì í"곌 ìœê° ë¹ì·íë©° ìŒë°ì ìŒë¡ 맚 ìì ììµëë€.
ìŽê±°í ë©€ë² ì ìž ë€ì ìŽê±°í ì€íë ë륌 ë£ë ê²ì ë°ëì êžì§íê³ ì¶ì§ë ììµëë€(묞ë²ìì íì©ëì§ ìë ê²ìŽ ì¢ë€ê³ ìê°íì§ë§). ê·žê²ìŽ ê²°êµ íì©ëë€ë©Ž, ê·žê²ì ë¶ëª í 늰í°ì 컀뮀ëí° ì»šë²€ì ìŽ íŒí ì ìë ê²ìŒë¡ ì§ì í ì ìë ê²ì ëë€. ê·žë ê² íŽìŒ í ì€ëë ¥ ìë ìŽì ê° ììµëë€.
- ììì ì«ì ê°ì íì¥ ì«ì ìŽê±°íì ìµëê° ìŽíì ê³ì 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 ìŽê±°íì ì ì¬ì©íë ê²ìŽì§ë§... êž°ì¡Ž ìŽê±°íì íì¥íë ê²ìŒë¡ ê°ì£Œëë ë°©ë²ì ì ì ììµëë€. ë¹ì ìŽíê³ ìë ìŒì ìŽê±° íì _ì¬ì©_íë ê²ì ëë€.
(ëí enum ë° switch 묞곌 ë¬ëŠ¬ ê·íì ìììë ì 첎 ê²ì¬ê° ìë ê² ê°ìµëë€. ëì€ì enum ë©€ë²ë¥Œ ì¶ê°í ì¬ëìŽ SINGULAR
ë° PLURAL
ì íŽë¹ í€ë¥Œ ì¶ê°íë ê²ì ììì ì ììµëë€. Label
ì 몚ë ìžì€íŽì€ìì PLURAL
ë ìœë)
@masak
ëì€ì ìŽê±°í ë©€ë²ë¥Œ ì¶ê°í ì¬ëì
Label
ì 몚ë ìžì€íŽì€ììSINGULAR
ë°PLURAL
ë ìœëì íŽë¹ í€ë¥Œ ì¶ê°íë ê²ì ìœê² ììŽë²ëŠŽ ì ììµëë€.
ì ìŽë ëŽ í겜ììë ìŽê±°í ë©€ë²ê° SINGULAR
ëë PLURAL
ìì ëëœëë©Ž ì€ë¥ê° ë°ìí©ëë€. Record
ì íìŽ ì ìí ì íë ê² ê°ìµëë€.
TSì ëí 묞ì ë íë¥íì§ë§ ë§ì êž°ë¥ì ì¬ìí ë°©ììŒë¡ ê²°í©íë ë°©ë²ì ëí ìë ë§ì§ ìë€ê³ ìê°í©ëë€. enum inheritance
ë êµì í 묞ì 륌 íŽê²°íë €ê³ í ë ìŽ ì€ë ëë¡ ìŽìŽì§ 첫 ë²ì§ž í목ìŽììµëë€. ìŽìšë ì ê·Œ ë°©ììŽ ì못ë ê²ìŒë¡ ë°íì ž ìŽ í¬ì€ížë¥Œ ìì±íê² ëììµëë€.
@illeatmyhat
ì ìŽë ëŽ í겜ììë ìŽê±°í ë©€ë²ê°
SINGULAR
ëëPLURAL
ìì ëëœëë©Ž ì€ë¥ê° ë°ìí©ëë€.Record
ì íìŽ ì ìí ì íë ê² ê°ìµëë€.
ì€! íž. ê·žëŠ¬ê³ ì, ê·žê²ì íšì¬ ë í¥ë¯žë¡ê² ë§ëëë€. ì²ììë ìŽê±°í ììì ëë¬íê³ ê²°êµìë íšíŽì ëë¬íë ê²ì ëíŽ ì믞íë ë°ë¥Œ ì ì ììµëë€. ê·žê²ì ê³ ëŠœë ìŒìŽ ìë ìë ììµëë€. "X/Y 묞ì "ë íì€ì
ëë€. ë ë§ì ì¬ëë€ìŽ " MyEnum
륌 íì¥íê³ ì¶ë€"ë ìê°ìŒë¡ ììíì§ë§ ê²°êµìë Record<MyEnum, string>
륌 ì¬ì©íê² ë ê²ì
ëë€.
ìŽê±°íì íì¥ì ì¬ì©íë©Ž ìŽ ìì±ìŽ ì°œ ë°ìŒë¡ ì¬ëŒì§ëë€.
ë¹ì ì ì°êž°,
@julian-sf: (ë°íì ì) ìŽê±°íì íì ìì¹ì ìŽíŽíê³ ëìí©ëë€. ê·žë¬ë 컎íìŒ ìê° íì¥ì 몚ë 컎íìŒë¬ì ìíŽ ì ì ë° êµ¬ì±ëë¯ë¡ ë°íì ì íì ìì¹ì ìë°íì§ ììµëë€.
ìŽê±°íì íì¥íë 몚ë ìœëê° íë¡ì ížì ìë€ê³ ê°ì íêž° ë묞ì ê·žê²ìŽ ì¬ì€ìŽ ìëëŒê³ ìê°í©ëë€. ê·žë¬ë íì¬ ëªšëì ìŽê±°íì íì¥í ì ììŒë©° ê°ìêž° 컎íìŒíë ìœëì ì ìŽë¥Œ ë²ìŽë ìŽê±°íìë í ë¹í ì ìë ì ìŽê±°í ë©€ë²ê° ììµëë€. Ʞ볞ì ìŒë¡ ìŽê±°íì 컎íìŒ íììë ë ìŽì ë«íì§ ììµëë€.
ëŽê° ìŽê²ì ëíŽ ìê°íë©Ž, ë¹ì ì ìì í ë§ìµëë€. ìŽê±°íì ë«ììŒ í©ëë€. ìŽê±°íì "ìì±"íë€ë ììŽëìŽê° ì ë§ ë§ìì ëëë€. ìŽê²ìŽ ì°ëŠ¬ê° ì¬êž°ì ìíë 묞ì ì íµì¬ìŽëŒê³ ìê°íêž° ë묞ì ëë€. ð¥³.
ìŽ íêž°ë²ì ë ê°ì ê°ë³ ìŽê±°íì "íšê» 꿰맀ë" ê°ë ì ë§€ì° ì°ìíê² ììœíë€ê³ ìê°í©ëë€.
enum ComposedEnum = { ...EnumA, ...EnumB }
ë°ëŒì extends
ëŒë ì©ìŽë¥Œ ì¬ì©íë ê²ì ëí ëì ì¬ìì ê³ ë €íììì€ ð
- "ëìŒí ì í" ìŽê±°í(ì«ìë ì«ì íì¥, 묞ììŽ íì¥ ë¬žììŽ)ë¡ ìŽê±°í íì¥ë§ íì©íê³ ì¶ë€ê³ ê°ì í©ëë€. ìŽêž°ì¢ ìŽê±°íì êž°ì ì ìŒë¡ ì§ìëë¯ë¡ ê·ž ì§ìì ì ì§íŽìŒ íë€ê³ ìê°í©ëë€.
ì ë ê·žë ê² ìê°í©ëë€. íŒí© ì íì 결곌 ìŽê±°íì ê·žë€ì§ ì ì©íì§ ìì ê² ê°ìµëë€.
ì ì©íì§ ìë€ë ë° ëìíì§ë§ ì¬êž°ìì ìŽê±°íì ëí ìŽêž°ì¢ ì§ìì ì ì§íŽìŒ í©ëë€(SHOULD). ì¬êž°ì linter ê²œê³ ê° ì ì©í ê²ìŽëŒê³ ìê°íì§ë§ TSê° ìŽë¥Œ ë°©íŽíŽìë ì ëë€ê³ ìê°í©ëë€. ëë ìžìì ìž ì¬ì© ì¬ë¡ë¥Œ ìê°í ì ììµëë€. ìŠ, ì«ìì 묞ììŽìŽ íŒí©ë íë귞륌 ì¬ì©íë ë§€ì° ì못 ì€ê³ë APIìì ìíž ìì©ì ìí ìŽê±°íì 구ì¶íê³ ììµëë€. ìëì ìŽëŒë 걎 ìëë€. íì§ë§ ë€ë¥ž ê³³ììë íì©ëêž° ë묞ì ì¬êž°ìì íì©íì§ ìììŒ íë€ê³ ìê°í©ëë€.
ê·žë¥ íì§ ë§ëŒë ê°í ê²©ë €ê° ìëê¹ì?
- ì¬ë¬ ìŽê±°íìì íì¥ì íì©íŽìŒ í©ëê¹? ê·žê²ë€ì 몚ë ìíž ë°°íì ìž ê°ì¹ë¥Œ ê°ì žìŒ í©ëê¹? ìëë©Ž ê²¹ì¹ë ê°ì íì©í©ëê¹? ìŽí ììì ë°ë¥ž ì°ì ìì?
ì°ëŠ¬ê° ë§íë ì믞 첎ê³ë¥Œ ë³µì¬íêž° ë묞ì ì¬ë¬ ìŽê±°íì ë³µì íë ê²ìŽ C++ìì ë€ì€ ììë³Žë€ "ë êŽì°®ì" ê²ì²ëŒ 볎ì ëë€. í¹í ê°ì²Ž íì°ì ì ì¶ë¥Œ ê³ì 구ì¶íë ê²œì° ë¬žì 륌 ìŠì ì ì ììµëë€. let newEnum = { ...enumA, ...enumB };
100% ëì
- 몚ë 구ì±ììŽ ìíž ë°°íì ìž ê°ì¹ë¥Œ ê°ì žìŒ í©ëê¹?
볎ìì ìž ê²ì "ì"ëŒê³ ë§íë ê²ì ëë€. ë€ì ë§íì§ë§, ê°ì²Ž íì°ì ë¹ì ë ì°ëŠ¬ìê² ëìì ìž ì믞륌 ì ê³µí©ëë€: ë§ì§ë§ ê²ìŽ ìŽê¹ëë€.
ëë ì¬êž°ìì ì°¢ìŽì¡ë€. ëë ê°ì¹ì ìíž ë°°íì±ì ìííë ê²ìŽ "ëªšë² ì¬ë¡"ëŒë ë° ëìíì§ë§ ê·žê²ìŽ ë§ìµëê¹? ìŒë°ì ìŒë¡ ìë €ì§ íì° ì믞ì ì§ì ì ìŒë¡ 몚ìë©ëë€. íížìŒë¡ë ìíž ë°°íì ìž ê°ì¹ë¥Œ ì ì©íë€ë ììŽëìŽê° ë§ìì ë€ì§ë§, ë€ë¥ž íížìŒë¡ë íì° ì믞 첎ê³ê° ìëíë ë°©ìì ëí ë§ì ê°ì ì 깚ëšëŠœëë€. "ìµíì ì¹ëŠ¬"ë¡ ìŒë°ì ìž ìŽí¬ ê·ì¹ì ë°ë¥Œ ë ëšì ìŽ ììµëê¹? 구íìŽ ë ì¬ìŽ ê²ì²ëŒ 볎ì ëë€(Ʞ볞 ê°ì²Žê° ìŽìšë ì§ëìŒ ë¿ìŽêž° ë묞ì). ê·žë¬ë ê·žê²ì ëí ìŒë°ì ìž êž°ëì ìŒì¹íë ê² ê°ìµëë€. ë ëëŒë 쪜ìŒë¡ êž°ìžê³ ììµëë€.
ê°ì ì¬ì ìíë €ë ì¢ì ìë ìì ì ììµëë€(ê·ž ê°ìŽ 묎ììžì§ë 몚륎ì§ë§).
ê·žë¬ë ë€ì ìê°íŽë³Žë©Ž "충ë ìì"곌 "ë§ì§ë§ìŽ ì¹ëŠ¬" ë ë€ ëª©ë¡ìì ìŽê±°íìŽ íŒì§êž° ì ì ìŽê±°í ë©€ë² ì ìžì ë£ê³ ì¶ìŽíë ê²ì¡°ì°š ìŽìí©ëë€. ì륌 ë€ìŽ, ê·žë ê² íšìŒë¡ìš ìŽë€ ìëê° ì ë¬ëê³ ììµëê¹? ì€íë ëë "ìì í"곌 ìœê° ë¹ì·íë©° ìŒë°ì ìŒë¡ 맚 ìì ììµëë€.
êžì, ê·žê²ì ì°ëŠ¬ê° íì° ìë¯žë¡ ì ë°ë¥žë€ë©Ž ììê° ë¬Žììžì§ë ì€ìíì§ ìììŒ í©ëë€. ìì§í, ìíž ë°°íì ìž ê°ì ì ì©íëëŒë ììë ë³ë¡ ì€ìíì§ ìê² ì£ ? 충ëì ììì êŽê³ììŽ íŽë¹ ì§ì ìì ì€ë¥ê° ë©ëë€.
- ììì ì«ì ê°ì íì¥ ì«ì ìŽê±°íì ìµëê° ìŽíì ê³ì 1ìŽëŒê³ ê°ì í©ëë€.
ìë§ë 볎ìì ìŒë¡ íŽìŒ í ìŒì ì€íë ë í 첫 ë²ì§ž 구ì±ìì ëíŽ ëª ìì ê°ì ì구íë ê²ì ëë€.
ëìíë€. ìŽê±°íì íŒëšëŠ¬ë©Ž TSë ì¶ê° 구ì±ìì ëíŽ ëª ìì ê°ì ì ì©íŽìŒ í©ëë€.
@julian-sf
ê·žë¬ë ëŽ ì¬ì êž°ê°ìŽ ì°ì¥ëë€ê³ ìê°íŽ ð
:+1: íí볎졎ííê° ììì ííží©ëë€.
ê·žë¬ë ë€ì ìê°íŽë³Žë©Ž "충ë ìì"곌 "ë§ì§ë§ìŽ ì¹ëŠ¬" ë ë€ ëª©ë¡ìì ìŽê±°íìŽ íŒì§êž° ì ì ìŽê±°í ë©€ë² ì ìžì ë£ê³ ì¶ìŽíë ê²ì¡°ì°š ìŽìí©ëë€. ì륌 ë€ìŽ, ê·žë ê² íšìŒë¡ìš ìŽë€ ìëê° ì ë¬ëê³ ììµëê¹? ì€íë ëë "ìì í"곌 ìœê° ë¹ì·íë©° ìŒë°ì ìŒë¡ 맚 ìì ììµëë€.
êžì, ê·žê²ì ì°ëŠ¬ê° íì° ìë¯žë¡ ì ë°ë¥žë€ë©Ž ììê° ë¬Žììžì§ë ì€ìíì§ ìììŒ í©ëë€. ìì§í, ìíž ë°°íì ìž ê°ì ì ì©íëëŒë ììë ë³ë¡ ì€ìíì§ ìê² ì£ ? 충ëì ììì êŽê³ììŽ íŽë¹ ì§ì ìì ì€ë¥ê° ë©ëë€.
ëë "ì ìì ìž íì ì ìž íì ì€íë ë륌 ë°°ì¹í íë¹í ìŽì ê° ìë€"ê³ ë§íê³ ììµëë€. "ì ì í ì í ì¬íì ë°ëŒ ììŽë ë€ì ë°°ì¹íŽë ì°šìŽê° ììµëë€"ëŒê³ ë§íê³ ììµëë€. ìŽ ë ê°ì§ë ëìì ì¬ì€ìŒ ì ììµëë€.
결곌ì 죌ì ì°šìŽì ì ìŒë° íìë³Žë€ ëšŒì ì€íë ë륌 íì©íê±°ë íì©íì§ ìë ë²ìì ìë ê² ê°ìµëë€. 구묞ì íì©ëì§ ìì ì ììµëë€. ëŠ°í° ê²œê³ ë¥Œ ìì±í ì ììµëë€. ëë 몚ë ë©Žìì ìì í êŽì°®ì ì ììµëë€. ììê° ì믞 ë¡ ì ì°šìŽê° ìë€ë©Ž ìŽê±° í ì€íë ë êž°ë¥ìŽ ìµì ëëŒì ì ìì¹ì ë°ë¥Žê³ ì¬ì©íêž° ìœê³ ê°ë¥Žì¹ê±°ë ì€ëª íêž° ìœëë¡ ë§ëë ê²ì ëë€.
ì€íë ë ì°ì°ì륌 ì¬ì©íë©Ž JS ë° TypeScript ì 첎ìì ìì ë³µì¬ê° ë êŽë²ìíê² ì¬ì©ë©ëë€. ì§ì ì ìž êŽê³ë¥Œ ììíë extends
륌 ì¬ì©íë ê²ë³Žë€ íì€í ë ë늬 ì¬ì©ëê³ ìŽíŽíêž° ì¬ìŽ ë°©ë²ì
ëë€. 구ì±ì íµíŽ ìŽê±°íì ë§ëë ê²ìŽ ë ì¬ì©íêž° ì¬ìŽ ì룚ì
ìŽ ë ê²ì
ëë€.
ì ì íŽê²° ë°©ë² ì€ ìŒë¶ë ì íšíê³ ì¬ì© ê°ë¥íì§ë§ ìíë ëìŒí 결곌륌 ì»êž° ìíŽ íšì¬ ë ë§ì ìì©êµ¬ ìœë륌 ì¶ê°í©ëë€. ìŽê±°íì ìµì¢ ì ìŽê³ ë³ê²œí ì ìë í¹ì±ì ê³ ë €í ë ë€ë¥ž ìžìŽì ìŒêŽë ìì±ì ì ì§íë €ë©Ž 구ì±ì íµíŽ ì¶ê° ìŽê±°íì ë§ëë ê²ìŽ ë°ëì§í©ëë€.
ìŽ ëíì 3ë ìŽ ìì§ ì§í ì€ìŽëŒë ê²ìŽ ì ê°ì ëë€.
@jmitchell38488 ê·íì ëêžì ì¢ìì륌 íìíê³ ì¶ì§ë§ ê·íì ë§ì§ë§ 묞ì¥ìŽ ì ë§ìì ë°ê¿šìµëë€. ì ìë ì룚ì
ìŽ ìëí ê²ìŽêž° ë묞ì ìŽê²ì íìí í ë¡ ìŽì§ë§ íŽëì€ì ìží°íìŽì€ë¥Œ ìŽë¬í ë°©ììŒë¡ íì¥í ê°ë¥ì±ë ëŽí¬íê³ ììµëë€. ìŽë Ʞ볞ì ìŒë¡ ëìŒí ìì
ì ìííë ë ê°ì§ ë°©ë²( class A extends B
ë° class A { ...(class B {}) }
)ìŒë¡ ëëêž° ë묞ì ìŒë¶ C++ ì ì¬ ìžìŽ íë¡ê·žëëšžê° typescript륌 ì¬ì©íë ê²ì ëë €ìí ì ìë í° ë³íì
ëë€. ëŽ ìê°ìë ë ê°ì§ ë°©ë² ëªšë ì§ìë ì ìì§ë§ ìŒêŽì±ì ìíŽ ìŽê±°íìë extend
ê° íìí©ëë€.
@masak wdyt? ^^
@sdwvit ëë íŽëì€ì ìží°íìŽì€ë¥Œ ìì±íêž° ìí ëìì ë³ê²œíë ê²ì ëíŽ ì·šíë ê²ìŽ ìëëŒ ìŽê±°íì ëíŽ êµ¬ì²Žì ìŒë¡ ìŽìŒêž°íê³ êµ¬ì±ì íµíŽ ìì±íë ê²ì ëíŽ ìŽìŒêž°íê³ ììµëë€. ê·žê²ë€ì ë³ê²œí ì ìë ìµì¢ ì íìŽë¯ë¡ ìŒë°ì ìž ìì ë°©ììŒë¡ íì¥í ì ììŽìŒ í©ëë€.
JSì í¹ì±ê³Œ ìµì¢ ížëì€íìŒë ê°ì ê°ìí ë í©ì±ìŽ ìŽë£šìŽì§ì§ ìì ìŽì ê° ììµëë€. ë¬Œë¡ ìŽê±° í ìì ì ë ë§€ë ¥ì ìŒë¡ ë§ë€ ê²ì ëë€.
@masak wdyt? ^^
í . ìžìŽ ìŒêŽì±ì ì¹ì°¬í ë§í 목íëŒê³ ìê°í©ëë€. ë°ëŒì íŽëì€ì ìží°íìŽì€ìì ì ì¬í ...
êž°ë¥ì ìì²íë ê²ì _ì íì ìŒë¡_ ì못ë ê²ìŽ ìëëë€. ê·žë¬ë ëë ê·ž ì¬ë¡ê° ë ìœíê±°ë ì¡Žì¬íì§ ìëë€ê³ ìê°íë©° ë ê°ì§ ìŽì ë묞ì: (a) íŽëì€ì ìží°íìŽì€ìë ìŽë¯ž íì¥ ë©ì»€ëìŠìŽ ìê³ ë ë²ì§žë¥Œ ì¶ê°íë©Ž ì¶ê° ê°ì¹ê° ê±°ì ììµëë€(ìŽê±°íì íë륌 ì ê³µíë©Ž ì¬ëë€ìŽ ëª ë
ëì ìŽ ë¬žì ë¡ ë€ì ëìììµëë€); (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
ë 묞ììŽ ìŽê±°íì ë¶í¬ëª
í íì§ë¡ ìžíŽ ìë¡ í ë¹í ì _ììµëë€_.
ìŽ êµ¬íì ë ë€ë¥ž ì¬ìí 결곌ë AdvEvents.Start
ê° ë¹ ë¥ž ì 볎 ë° ì ìž ë°©ì¶ìì BasicEvents.Start
ë¡ ì§ë ¬íëë€ë ê²ì
ëë€(ì ìŽë AdvEvents
ì ë©€ë²ë¥Œ ì°ê²°íë 구묞 컚í
ì€ížê° ìë 겜ì°). â AdvEvents.Start
늬í°ëŽ ííì ìë¡ ë§ì°ì€ë¥Œ ê°ì žê°ë©Ž AdvEvents.Start
ëŒë ë¹ ë¥ž ì ë³Žê° ëì¬ ì ìì§ë§ ê·žëŒìë ë¶êµ¬íê³ BasicEvents.Start
륌 íìíë ê²ìŽ ë ëª
íí ì ììµëë€.
ìŽê²ì 묞ììŽ ìŽê±°íììë§ íì©ë©ëë€.
ëë ìŽê²ì ìëíê³ ì¶ë€.
ëª íí íêž° ìíŽ: ìŽê²ì 구íì ìíŽ ì¹ìžëì§ ìììµëë€.
ì¬êž°ìë ë ê°ì§ ê°ë¥í ëììŽ ììŒë©° ë ë€ ì¢ì§ ììµëë€.
Spreadê° ì€ì ë¡ spreaded enumì ë©€ë²ë¥Œ ë³µì¬íë ê²ê³Œ ê°ì ì믞ëŒë©Ž ì¬ëë€ìŽ íì¥ enumì ê°ì íì¥ enumì ê°ìž ê²ì²ëŒ ì¬ì©íë €ê³ íë©Ž ìëíì§ ìë í° ëëŒììŽ ìì ê²ì ëë€.
ì ížëë ìµì ì ì€íë ëê° ì€ë ë ìëš ê·Œì²ìì @aj-rì íµí© ì í ì ì곌 ââë ì ì¬íê² ìëíë ê²ì ëë€. ê·žê²ìŽ ì¬ëë€ìŽ ìŽë¯ž ìíë íëìŽëŒë©Ž í ìŽëžì ìë êž°ì¡Ž ìµì ìŽ ìŽíŽë¥Œ ëêž° ìíŽ ì격íê² ì ížëë ê²ì²ëŒ 볎ì ëë€. ê·žë ì§ ììŒë©Ž ì°ëŠ¬ë ë€ë¥ž 묞ììŽ ìŽê±°íì²ëŒ ìëíì§ ìë ìë¡ìŽ ì¢ ë¥ì 묞ììŽ ìŽê±°íì ë§ë€ê³ ììµëë€. ìŽë ìŽìíê³ ì¬êž° ì ìì "ëšìíš"ì íŒìíë ê² ê°ìµëë€.
ì¬ëë€ì ìŽë€ íëì ìíë©° ê·ž ìŽì ë 묎ìì ëê¹?
ëë í° ëëŒììŒë¡ ìŽìŽì§êž° ë묞ì ìµì 1ì ìíì§ ììµëë€.
ìµì
2륌 ìíì§ë§ ìžêžë @aj-rì ëšì ì 극복í ì ìë 충ë¶í 구묞 ì§ìì ìíë¯ë¡ ê·žì ìì ìì let e: Events = Events.Pause;
륌 ìì±í ì ììµëë€. ëšì ì ëì°íì§ ìì§ë§ íì¥ë ìŽê±°íìŽ êµ¬íì ìšêžž ì ìë ê³³ì
ëë€. ê·žëì ì¢ ì§ê·žëœìµëë€.
ëë ëí ìµì
1ìŽ ëì ìê°ìŽëŒê³ ìê°í©ëë€. íì¬ìì ìŽ ë¬žì ì ëí 찞조륌 ê²ìíê³ ë§í¬ë ë ê°ì ìœë 늬뷰륌 ì°ŸììŒë©° ë ê²œì° ëªšë(ëŽ ê°ìžì ìž ê²œíìì) ë ìì ìŽê±°íì ìì륌 ë í° ìŽê±°í ì íì í ë¹í ì ììŽìŒ íë€ë ë¶ëª
í íìì±ìŽ ììµëë€. . í¹í í ì¬ëìŽ ...
륌 ëì
íì¬ ìµì
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};
ì ë ê·ž ì ê·Œ ë°©ìì ë ê°ì§ 죌ì 묞ì ê° ìë€ê³ ëŽ ëë€.
Events.Pause
륌 ì íìŒë¡ ì¬ì©í ì ìêž° ë묞ì ë¶ìì í©ëë€.ëë ìŽì ì ë ë²ì§ž êžëšžëŠ¬ êž°ížë¥Œ ë€ë£° https://github.com/microsoft/TypeScript/issues/29130 ì ì ìíìŒë©° (묎ì볎ë€ë) ë ë²ì§ž êžëšžëŠ¬ êž°ížë¥Œ íŽê²°í ì ìì§ë§ ì¬ì í ê°ì¹ê° ìì ì ìë€ê³ ìê°í©ëë€. ìŽëŠìŽ ìëíë ë°©ì.
ë ê°ì§ ì ì 몚ë ë€ë£° ê²ìŽëŒê³ ìê°íë í ê°ì§ 구묞 ììŽëìŽë ì íë ì ìžíë ë첎 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
(ìµì
2) ì¬ìŽì í ë¹ ê°ë¥ì±ì ìí ë unique
륌 ìëµí©ëë€.
const type
ë° const unique type
륌 ì¬ì©íë©Ž êž°ì¡Ž ìŽê±°íì ê¹ëíê² íµí©íë ë°©ë²ê³Œ ìŽê±°íì ìŒíì±ìŽ ìë TS êž°ë¥ì ìì°ì€ë¬ìŽ ì¡°í©ìŒë¡ íííë ë°©ë²ìŽ ììµëë€.
ë¬Žìš ìŒìŽìŒ? ð
ìì° 2017ë ð€ª, ë¬Žìš íŒëë°±ìŽ ë íìí ê¹ì?
ìŽë€ íŒëë°±ìŽ ë íìí©ëê¹?
ë°ë¡ ì¬êž°ì??? ì ììŽ ì€ëëìë€ê³ íŽì ì ìì 구ííë ê²ì ìëëë€!
ìŽë€ íŒëë°±ìŽ ë íìí©ëê¹?
ë°ë¡ ì¬êž°ì??? ì ììŽ ì€ëëìë€ê³ íŽì ì ìì 구ííë ê²ì ìëëë€!
ë€. ìŽë€ ë°©ììžì§ íì ìŽ ìì§ ìììµëë€.
ë€ì ìœê³ ë ë³Žê³ #40998 ê·žê² ìµì ì ë°©ë²ìŽëŒê³ ìê°í©ëë€... emunì ê°ì²ŽìŽê³ ì€íë ëë enumì ë³í©/íì¥íêž°ê° ë ìœë€ê³ ìê°í©ëë€.
ìžìŽ ëììžì ëí ì견ì ì ìí ì ìë ì격ì ìì§ë§ ìŒë° ê°ë°ìë¡ì íŒëë°±ì ì€ ì ìë€ê³ ìê°í©ëë€.
ìŽ êž°ë¥ì ì¬ì©íë €ë ì€ì íë¡ì ížìì ëª ì£Œ ì ì ìŽ ë¬žì 륌 ì íìµëë€. @alangpierce ì ì ê·Œ ë°©ì ì ì¬ì© íê² ëììµëë€ . ë¶ííë ê³ ì©ì£Œì ëí ì± ì ë묞ì ì¬êž°ìì ìœë륌 ê³µì í ì ìì§ë§ ëª ê°ì§ ì¬íì ë€ì곌 ê°ìµëë€.
ì ë°ì ìŒë¡ ì§ë£ší ë¹ìŠëì€ ë¡ì§ì ê°ì§ ë§ì ì€ì íë¡ì ížê° ìŽ êž°ë¥ì íµíŽ ë§ì ìŽì ì ì»ì ì ìë€ê³ ìê°í©ëë€. ìŽê±°íì ë€ë¥ž íì ì íìŒë¡ ë¶í íë©Ž ì í ìì€í ìŽ íì¬ ëšì í ì€ížìì íìžíë ë§ì ë¶ë³ëì íìží ì ììŒë©° ì í ìì€í ìì ì못ë ê°ì ííí ì ìëë¡ ë§ëë ê²ì íì ì¢ì ìŒì ëë€.
ìë ,
ì¬êž°ì ëŽ 2ìŒížë¥Œ ì¶ê°íê² ìµëë€ ð
tsoa ë¡ ìì±ë OpenApi 묞ìì íšê» APIê° ììµëë€.
ëŽ ëªšëž ì€ íëì ë€ì곌 ê°ìŽ ì ìë ìíê° ììµëë€.
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ì íì¥ìŒ ìŽì ê° ìêž° ë묞ì ìŽê±°íìì "íì¥"íê³ ì¶ì§ ììµëë€. ë³Žë€ ìŒë°ì ìž ìŽê±°íìì "ì í"í ì ìꞰ륌 ë°ëëë€.
ëë extends ì ìë³Žë€ ì€íë ë ì°ì°ìê° ë ë«ë€ë ê²ì ììì§ë§ ë ëìê° ë€ìì ì ìíê³ ì¶ìµëë€.
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'
)ì²ëŒ ìëíëë¡ ìŽê±°í ì íì ëí ì ìœì ìííê³ ì¶ìµëë€.
컎íìŒë¬ì ìŽë¬í ë¥ë ¥ì ì¶ê°íë©Ž ëìŒí ê°ì ê°ì§ ë ê°ì ë
늜ì ìž ìŽê±°íì ê³µì©ì²Žì ëìŒí ê·ì¹ìŒë¡ ìë¡ í ë¹í ì ììµëë€.
ë€ì ìŽê±°íìŽ ì£ŒìŽì§ë©Ž:
enum A { a = 'a', b = 'b' }
enum B { a = 'a' , c = 'c' }
enum C { ...A, c = 'c' }
ê·žëŠ¬ê³ ìž ê°ì ë³ì a:A
, b:B
ë° c:C
c = a
ê° ìëíŽìŒ í©ëë€.'a' | 'c'
ìŽë¯ë¡ c = b
ê° ìëíŽìŒ í©ëë€.a
ê° 'b'
ì ë€ë¥ž ê²ìŒë¡ ìë €ì§ ê²œì° $ b = a
ê° ìëí ì ììµëë€( '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'
ëë ìŽ ì ììŽ enumìŽ ë¬Žììžì§ ì€ì ë¡ ë³ê²œíì§ ìê³ ë ë§ì ì í ìì ì±( as unknown as T
ì ë¹êµ)ì íì©íë©Žì TS ê°ë°ìê° ìì
íêž°ì ë§€ì° ì ì°íê³ ìì°ì€ëœë€ë ê²ì ìììµëë€. ìŽê±°íì ë©€ë²ë¥Œ ì¶ê°íë ìë¡ìŽ ë°©ë²ê³Œ ìŽê±°íì ìë¡ ë¹êµíë ìë¡ìŽ ë°©ë²ì ìê°í©ëë€.
ìŽë»ê² ìê°íŽ? ìŽ êž°ë¥ì ì¬ì©í ì ìê² ë§ëë ëª
ë°±í ìžìŽ ìí€í
ì² ë¬žì 륌 ëì³€ìµëê¹?
ê°ì¥ ì ì©í ëêž
몚ë íŽê²° ë°©ë²ì ì¢ì§ë§ ê°ë¥í í ê°ëšíê² ì² ì í ê²ì¬ë¥Œ ì¬ì©í ì ìëë¡ typescript ì첎ìì ìŽê±°í ìì ì§ìì ë³Žê³ ì¶ìµëë€.