Typescript: 묞자엎 êž°ë°˜ 엎거형 확장

에 만든 2017년 08월 03음  Â·  68윔멘튞  Â·  출처: microsoft/TypeScript

묞자엎 êž°ë°˜ 엎거형 읎전에는 많은 것듀읎 객첎로 대첎되었습니닀. 객첎륌 사용하멎 유형을 확장할 수도 있습니닀. 예륌 듀얎:

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"
};
Awaiting More Feedback Suggestion

가장 유용한 댓Ꞁ

몚든 í•Žê²° 방법은 좋지만 가능한 한 간닚하게 철저한 검사륌 사용할 수 있도록 typescript 자첎에서 엎거형 상속 지원을 볎고 싶습니닀.

몚든 68 댓Ꞁ

조ꞈ 가지고 놀았고 현재 확장 유형 에 대한 개첎륌 사용하여 읎 확장을 수행할 수 있윌므로 잘 작동핎알 합니닀.

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

obrazek

+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' };

https://github.com/Microsoft/TypeScript/pull/29510

엎거형 확장은 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 플레읎귞띌욎드 링크

invalid access

간닚히 말핎서, 나는 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

읞슀턎슀/큎래슀 읎분법읎 싀제로 엎거형에 할당할 수 없Ʞ 때묞에 읎 추론은 음종의 였핎의 소지가 있닀고 생각합니닀. 엎거형은 큎래슀가 아니며 읞슀턎슀가 없습니닀.

당신의 말읎 절대적윌로 옳습니닀.

  • 독늜적읞 ì–žì–Ž 구성윌로 볌 때 엎거형에는 읞슀턎슀가 아니띌 _구성원_읎 있습니닀. "회원"읎띌는 용얎는 핞드북곌 ì–žì–Ž 사양에서 몚두 사용됩니닀. (C#곌 Python은 유사하게 "멀버"띌는 용얎륌 사용합니닀. Java에서는 "멀버"가 였버로드된 의믞륌 ê°–êž° 때묞에 Java는 "엎거형 상수"륌 사용합니닀.)
  • 컎파음된 윔드 ꎀ점에서 볌 때 엎거형에는 _properties_가 있얎 읎늄에서 값윌로, 값에서 읎늄윌로 맀핑됩니닀. 닀시 말하지만 읞슀턎슀가 아닙니닀.

읎것에 대핮 생각하멎서, 나는 ë‚Žê°€ 엎거형에 대한 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> 륌 사용하게 될 것입니닀.

@masak 에 답장:

엎거형에 확장을 사용하멎 읎 속성읎 ì°œ 밖윌로 사띌집니닀.

당신은 ì“°êž°,

@julian-sf: (런타임 시) 엎거형의 폐쇄 원칙을 읎핎하고 동의합니닀. 귞러나 컎파음 시간 확장은 몚두 컎파음러에 의핎 정의 및 구성되므로 런타임 시 폐쇄 원칙을 위반하지 않습니닀.

엎거형을 확장하는 몚든 윔드가 프로젝튞에 있닀고 가정하Ʞ 때묞에 귞것읎 사싀읎 아니띌고 생각합니닀. 귞러나 타사 몚듈은 엎거형을 확장할 수 있윌며 갑자Ʞ 컎파음하는 윔드의 제얎륌 벗얎나 엎거형에도 할당할 수 있는 새 엎거형 멀버가 있습니닀. Ʞ볞적윌로 엎거형은 컎파음 타임에도 더 읎상 닫히지 않습니닀.

ë‚Žê°€ 읎것에 대핮 생각하멎, 당신은 완전히 맞습니닀. 엎거형은 ë‹«ì•„ì•Œ 합니닀. 엎거형을 "작성"한닀는 아읎디얎가 정말 마음에 듭니닀. 읎것읎 우늬가 여Ʞ서 원하는 묞제의 핵심읎띌고 생각하Ʞ 때묞입니닀. 🥳.

읎 표Ʞ법은 두 개의 개별 엎거형을 "핚께 꿰맀는" 개념을 맀우 우아하게 요앜한닀고 생각합니닀.

enum ComposedEnum = { ...EnumA, ...EnumB }

따띌서 extends 띌는 용얎륌 사용하는 것에 대한 나의 사임을 고렀하십시였 😆


@JeffreyMercado의 질묞에 대한 @masak 의 답변에 대한 댓Ꞁ:

  • "동음한 유형" 엎거형(숫자는 숫자 확장, 묞자엎 확장 묞자엎)로 엎거형 확장만 허용하고 싶닀고 가정합니닀. 읎Ʞ종 엎거형은 Ʞ술적윌로 지원되므로 ê·ž 지원을 유지핎알 한닀고 생각합니닀.

저도 귞렇게 생각합니닀. 혌합 유형의 결곌 엎거형은 귞닀지 유용하지 않은 것 같습니닀.

유용하지 않닀는 데 동의하지만 여Ʞ에서 엎거형에 대한 읎Ʞ종 지원을 유지핎알 합니닀(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 륌 표시하는 것읎 더 명확할 수 있습니닀.

  • 읎것은 묞자엎 엎거형에서만 허용됩니닀.

나는 읎것을 시도하고 싶닀.

명확히 하Ʞ 위핎: 읎것은 구현을 위핎 승읞되지 않았습니닀.

여Ʞ에는 두 가지 가능한 동작읎 있윌며 둘 ë‹€ 좋지 않습니닀.

옵션 1: 사싀 섀탕입니닀

Spread가 싀제로 spreaded enum의 멀버륌 복사하는 것곌 같은 의믞띌멎 사람듀읎 확장 enum의 값을 확장 enum의 값읞 것처럌 사용하렀고 하멎 작동하지 않는 큰 놀띌움읎 있을 것입니닀.

옵션 2: 싀제로 섀탕읎 아닙니닀.

선혞되는 옵션은 슀프레드가 슀레드 상닚 귌처에서 @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};

저는 ê·ž ì ‘ê·Œ 방식에 두 가지 죌요 묞제가 있닀고 뎅니닀.

  • TypeScript륌 배우는 사람에게는 정말 혌란슀럜습니닀. 유형 공간곌 값 공간에 대한 확싀한 읎핎가 없닀멎 상수로 유형을 덮얎쓰는 것처럌 볎입니닀.
  • 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 의 ì ‘ê·Œ 방식 을 사용 하게 되었습니닀 . 불행히도 고용죌에 대한 책임 때묞에 여Ʞ에서 윔드륌 공유할 수 없지만 몇 가지 사항은 닀음곌 같습니닀.

  1. 반복 ì„ ì–ž(새 엎거형의 겜우 type 및 const 몚두)은 큰 묞제가 아니며 가독성을 크게 손상시킀지 않았습니닀.
  2. 필자의 겜우 enum은 특정 알고늬슘에 대핮 서로 닀륞 동작을 나타낎었고 읎 알고늬슘에는 닀양한 상황에 대핮 서로 닀륞 동작 섞튞가 있었습니닀. 유형 계잵을 사용하여 특정 작업읎 컎파음 시간에 발생할 수 없음을 확읞할 수 있었습니닀. 읎것읎 전첎의 요점읎었고 맀우 유용한 것윌로 판명되었습니닀.
  3. ë‚Žê°€ 작성한 윔드는 낎부 띌읎람러늬였윌며, 띌읎람러늬 낎부에서는 서로 닀륞 enum 유형을 구분하는 것읎 쀑요했지만 읎 띌읎람러늬의 왞부 사용자에게는 쀑요하지 않았습니닀. 읎 ì ‘ê·Œ 방식을 사용하여 낎부에 있는 몚든 닀륞 엎거형의 합계 유형읞 하나의 유형만 낎볎낎고 구현 섞부 정볎륌 숚Ꞟ 수 있었습니닀.
  4. 불행히도 나는 형식 선얞에서 자동윌로 합계 형식의 값을 구묞 분석하는 ꎀ용적읎고 읜Ʞ 쉬욎 방법을 알아낌 수 없었습니닀. (제 겜우에는 ë‚Žê°€ 얞꞉한 닀륞 알고늬슘 닚계가 런타임에 SQL 데읎터베읎슀에서 로드되었습니닀). 귞것은 큰 묞제가 아니었지만(파싱 윔드륌 수동윌로 작성하는 것은 충분히 간닚했습니닀), 엎거형 상속의 구현읎 읎 묞제에 앜간의 죌의륌 Ʞ욞읞닀멎 좋을 것입니닀.

전반적윌로 지룚한 비슈니슀 로직을 가진 많은 싀제 프로젝튞가 읎 Ʞ능을 통핎 많은 읎점을 얻을 수 있닀고 생각합니닀. 엎거형을 닀륞 하위 유형윌로 분할하멎 유형 시슀템읎 현재 닚위 테슀튞에서 확읞하는 많은 불변량을 확읞할 수 있윌며 유형 시슀템에서 잘못된 값을 표현할 수 없도록 만드는 것은 항상 좋은 음입니닀.

안녕,

여Ʞ에 낮 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

  • A는 C의 하위 집합음 뿐읎므로 A의 몚든 값은 C의 유횚한 값읎므로 c = a 가 작동핎알 합니닀.
  • B는 C의 유횚한 값읞 '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 개발자가 작업하Ʞ에 맀우 유연하고 자연슀럜닀는 것을 알았습니닀. 엎거형에 멀버륌 추가하는 새로욎 방법곌 엎거형을 서로 비교하는 새로욎 방법을 소개합니닀.
얎떻게 생각핎? 읎 Ʞ능을 사용할 수 없게 만드는 명백한 ì–žì–Ž 아킀텍처 묞제륌 놓쳀습니까?

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉