Typescript: рд╕рд░рдгреА рдореЗрдВ рдорд╛рдиреЛрдВ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рдЕрдХреНрддреВре░ 2018  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 3.0.3


рдЦреЛрдЬ рд╢рдмреНрдж: рд╕рд░рдгреА рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

рдХреНрдпрд╛ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рддрд╛рд░ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрддрдорд╛рди рдпрд╛ рдирд┐рдпреЛрдЬрд┐рдд рд╕реБрд╡рд┐рдзрд╛ рд╣реИ?

рдХреЛрдб

const values = ['A', 'B']
type Foo = OneOf<values> // Is there a way of doing this?

const v1: Foo = 'A' // This should work
const v2: Foo = 'D' // This should give me an error since 'D' doesn't exist in values

keyof рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдорд╛рди:

const values = {
  A: 'A',
  B: 'B'
}
type Foo = keyof typeof values
const v1: Foo = 'A'
const v2: Foo = 'D' // Type '"D"' is not assignable to type '"A" | "B"'

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ:https://github.com/Microsoft/TypeScript/issues/20965

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ http://www.typescriptlang.org/play/#src = рдЬрд╛рдиреЗ% 20vals1% 20% 3 рдбреА% 20% 5B'A '% 2C% 20'B'% 5D% 0 d% 0Atype% 20Foo1% 20% 3 рдбреА% 20OneOf% 3Cvals1% 3E% 20% 2F% 2F% 20Is% 20there% 20a% 20way% 20of% 20doing% 20this% 3F% 0 d% 0A% 0 d% 0Alet% 20v1% 3A% 20Foo1% 20% 3 рдбреА% 20 ' рдП '% 20% 2F% 2F% 20This% 20should% 20work% 0 d% 0Alet% 20v2% 3A% 20Foo1% 20% 3 рдбреА% 20'D'% 20% 2F% 2F% 20This% 20should% 20give% 20me% 20an% 20error% 20since% 20'D '% 20doesn't% 20exist% 20in% 20values% 0 d% 0A% 0 d% 0Alet% 20vals2% 20% 3 рдбреА% 20% 7B% 0 d% 0A% 20% 20A% 3A% 20'A '% 2C% 0 d% 0A% 20% 20B% 3A% 20'B'% 0 d% 0A% 7 рджрд┐рди% 0 d% 0Atype% 20Foo2% 20% 3 рдбреА% 20keyof% 20typeof% 20vals2% 0 d% 0Alet% 20v3% 3A% 20Foo2 % 20% 3 рдбреА% 20'A '% 0 d% 0Alet% 20v4% 3A% 20Foo2% 20% 3 рдбреА% 20'D'% 20% 2F% 2F% 20Type% 20 '% 22d% 22'% 20is% 20not% 20assignable % 20to% 20type% 20 '% 22A% 22% 20% 7C% 20% 22B% 22'

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

[email protected] рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЛ

export const type = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof type[number];
}

рд╕рднреА 16 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

keyof рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЯреАрдПрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд┐рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рдб рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХрдВрдЯреЗрдВрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд╛рдЗрдк рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ:

function stringLiterals<T extends string>(...args: T[]): T[] { return args; }
type ElementType<T extends ReadonlyArray<unknown>> = T extends ReadonlyArray<infer ElementType> ? ElementType : never;

const values = stringLiterals('A', 'B');
type Foo = ElementType<typeof values>;

const v1: Foo = 'A' // This should work
const v2: Foo = 'D' // This should give me an error since 'D' doesn't exist in values

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред # 27179 рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рднреА рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЬреНрдЮрд╛рдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ; рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдлрд╛рдпрджрд╛ рд╕рд┐рд░реНрдл тАЭAтАЭ | тАЬBтАЭ рдХрд╣рдиреЗ рдкрд░ рд╣реИред

@fatcerberus рджреЛрд╣рд░рд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ - рдпрджрд┐ рдЖрдк рд╕рд┐рд░реНрдл const values = ["A", "B"]; type Foo = "A" | "B"; рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬрдмрдХрд┐ рджреВрд╕рд░реЗ рдХреЛ рдмрджрд▓рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк const values: Foo[] =["A", "B"]; рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА Foo рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдиреЗ рдФрд░ values рдореЗрдВ рд░рдЦрдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рдЕрдм рд╣рдо рдХрд╣рд╛рдВ рд╣реИрдВ?

@ @ -Y-ms рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдФрд░ рдЬреИрд╕реЗ @fatcerberus рдиреЗ рдХрд╣рд╛, рдкреНрд░рдХрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ

рдкрд░ @ Andy-рдПрдордПрд╕ рдХреА рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдЬрд╡рд╛рдм рд╣реИ, рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рджрд╛рд╡реЗ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 3.4 рдореЗрдВ рд╢реБрд░реВ рдХреА, рдпрд╣ рдЕрдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ

const values = ['A', 'B'] as const
type ElementType < T extends ReadonlyArray < unknown > > = T extends ReadonlyArray<
  infer ElementType
>
  ? ElementType
  : never

type Foo = ElementType<typeof values> // this is correctly inferred as literal "A" | "B"

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ 'рдкреНрд░рд╢реНрди' рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рджреЗрдЦреА рдЧрдИ рд╣реИред рдЗрд╕реЗ рдШрд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдЕрднреА рднреА рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕рд╡рд╛рд▓ рдЖрдорддреМрд░ рдкрд░ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реИрдВ stackoverflow ред

[email protected] рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЛ

export const type = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof type[number];
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛:

export const items = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof items[number];
}

рддреБрдо рдпрд╣ рдХреЗрд░ рд╕рдХрддреЗ рд╣реЛ:

export const items = [
  'room',
  'room_with_gifter',
  'user_send'
] as const;

export type Item = typeof items;

export interface Activity {
  id?: string;
  type: Item;
}

image

_Really рдПрдХ рдЪрд░ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ ред_

@ 7kms

[email protected] рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЛ

export const type = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof type[number];
}

рдЕрдм рдЕрдЧрд░ рдореБрдЭреЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

class Class {
  const list = <const>[
   'room',
   'room_with_gifter',
   'user_send'
 ];

 const withType: typeof list[number];
}

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВ this.list[number] рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдХреЗ рд▓рд┐рдП
usecase, рдореИрдВ list static рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@ 7kms

[email protected] рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЛ

export const type = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof type[number];
}

рдЕрдм рдЕрдЧрд░ рдореБрдЭреЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

class Class {
  const list = <const>[
   'room',
   'room_with_gifter',
   'user_send'
 ];

 const withType: typeof list[number];
}

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВ this.list[number] рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдХреЗ рд▓рд┐рдП
usecase, рдореИрдВ list static рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@vegerot рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдирд╣реАрдВ const рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реАрдзреЗ class , рдЗрд╕рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред

@ 7kms

[email protected] рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЛ

export const type = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof type[number];
}

рдЕрдм рдЕрдЧрд░ рдореБрдЭреЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

class Class {
  const list = <const>[
   'room',
   'room_with_gifter',
   'user_send'
 ];

 const withType: typeof list[number];
}

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВ this.list[number] рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдХреЗ рд▓рд┐рдП
usecase, рдореИрдВ list static рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@vegerot рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдирд╣реАрдВ const рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реАрдзреЗ class , рдЗрд╕рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред

@ 7kms рдореЗрд░рд╛ рдмреБрд░рд╛ред рдореИрдВрдиреЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ред рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ

class Class {
  private list = <const>[
   'room',
   'room_with_gifter',
   'user_send'
 ];

 private withType: typeof list[number];

// OR
  private withType2: typeof this.list[number];

}

рдЖрджрд┐ рд╕рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ usecase рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@ 7kms

[email protected] рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЛ

export const type = <const>[
  'room',
  'room_with_gifter',
  'user_send'
];

export interface Activity {
  id?: string;
  type: typeof type[number];
}

рдЕрдм рдЕрдЧрд░ рдореБрдЭреЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

class Class {
  const list = <const>[
   'room',
   'room_with_gifter',
   'user_send'
 ];

 const withType: typeof list[number];
}

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВ this.list[number] рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ рдХреЗ рд▓рд┐рдП
usecase, рдореИрдВ list static рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@vegerot рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдирд╣реАрдВ const рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╕реАрдзреЗ class , рдЗрд╕рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред

@ 7kms рдореЗрд░рд╛ рдмреБрд░рд╛ред рдореИрдВрдиреЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ред рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ

class Class {
  private list = <const>[
   'room',
   'room_with_gifter',
   'user_send'
 ];

 private withType: typeof list[number];

// OR
  private withType2: typeof this.list[number];

}

рдЖрджрд┐ рд╕рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рд╡рд┐рд╢реЗрд╖ usecase рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

class Class {
  private list = [
    "room",
    "room_with_gifter",
    "user_send"
  ] as const

  private withType: Class["list"][number]
}

@vegerot рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

@eyalch рдХрдорд╛рд▓ рд╣реИ! рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╕рдорд╛рдзрд╛рди typeof рдпрд╛ рдХреБрдЫ рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдореБрдЭреЗ рдЙрд╕ рд╣реИрдВрдбрдмреБрдХ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ?

@eyalch рдХрдорд╛рд▓ рд╣реИ! рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╕рдорд╛рдзрд╛рди typeof рдпрд╛ рдХреБрдЫ рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдореБрдЭреЗ рдЙрд╕ рд╣реИрдВрдбрдмреБрдХ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ?

@vegerot рдЬрд╝рд░реВрд░, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ "рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрд╛рд░" рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИрдВрдбрдмреБрдХ рдореЗрдВ рд╣реИ: https://www.typescriptlang.org/docs/handbook/advanced-types.html#index -types

рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ!

рдЕрд░реЗ% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%, рдЕрдЧрд░ ElementType рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ,
рд╕рд░рдгреА рдХреЗ рдмрд╛рдж as const рдзреНрдпрд╛рди рд░рдЦреЗрдВ ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

seanzer picture seanzer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

manekinekko picture manekinekko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

blendsdk picture blendsdk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

weswigham picture weswigham  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

siddjain picture siddjain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ