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 = let % 20vals1 % 20 % 3D % 20 % 5B'A '% 2C % 20'B'% 5D % 0D % 0Atype % 20Foo1 % 20 % 3D % 20OneOf % 3Cvals1 % 3E % 20 % 2F % 2F % 20Is % 20there % 20a % 20way % 20of % 20doing % 20this % 3F % 0D % 0A % 0D % 0Alet % 20v1 % 3A % 20Foo1 % 20 % 3D % 20 ' A '% 20 % 2F % 2F % 20This % 20should % 20work % 0D % 0Alet % 20v2 % 3A % 20Foo1 % 20 % 3D % 20'D'% 20 % 2F % 2F % 20This % 20should % 20give % 20me % 20an % 20error % 20since % 20'D '% 20doesn't % 20exist % 20in % 20values ββ% 0D % 0A % 0D % 0Alet % 20vals2 % 20 % 3D % 20 % 7B % 0D % 0A % 20 % 20A % 3A % 20'A '% 2C % 0D % 0A % 20 % 20B % 3A % 20'B'% 0D % 0A % 7D % 0D % 0Atype % 20Foo2 % 20 % 3D % 20keyof % 20typeof % 20vals2 % 0D % 0Alet % 20v3 % 3A % 20Foo2 % 20 % 3D % 20'A '% 0D % 0Alet % 20v4 % 3A % 20Foo2 % 20 % 3D % 20'D'% 20 % 2F % 2F % 20Type % 20 '% 22D % 22'% 20is % 20not % 20assignable % 20to % 20type % 20 '% 22A % 22 % 20 % 7C % 20 % 22B % 22'
keyof
λ μ»΄νμΌ νμμ μ μ μΌλ‘ μλ €μ§ μ 보λ₯Ό μ¬μ©νκΈ° λλ¬Έμ μλν©λλ€. TSμ μ νμ μμ ν μ§μΈ μ μκ³ νΈλμ€ νμΌ λ μ½λμ μ‘΄μ¬νμ§ μμΌλ―λ‘ λ°°μ΄μ λ°νμ μ½ν
μΈ λ₯Ό κΈ°λ°μΌλ‘ μ νμ λ§λλ κ²μ΄ λΆκ°λ₯ν©λλ€.
μ΄κ²μ κ°λ₯νλ€:
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
.
μ§κΈ μ°λ¦¬λ μ΄λμ μμ΅λκΉ?
@ andy-msκ° λ§νλ―μ΄ μλμΌλ‘ μ 보λ₯Ό λ°λ³΅νμ§ μλ κ²μ΄ μ λ§ μ μ© ν κ²μ΄λΌκ³ λ§νμ΅λλ€.
@fatcerberusκ° λ§νλ―μ΄ μ νμ μμ ν μ§μΈ μ μμ΅λλ€. μλ₯Ό λ€μ΄ μ ν리μΌμ΄μ
μ μμνμ§ μμ λΆλΆ (μ : μΉ μλΉμ€ λλ μ¬μ©μ)μμ μ»μ λ°μ΄ν°λ₯Ό λ°νμ νμΈν΄μΌνλ κ²½μ°κ° μμ΅λλ€.
@ andy-msμ λ΅λ³μ κΈ°λ° μΌλ‘νκ³ typescript 3.4μ λμ λ const μ΄μ€ μ μ μ¬μ©νλ©΄ μ΄μ λ€μκ³Ό κ°μ μμ μ μν ν μ μμ΅λλ€.
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;
}
_ 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]
λ ν μ μμ΅λλ€. λν λ΄ νΉμ
μ¬μ© μ¬λ‘, 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]
λ ν μ μμ΅λλ€. λν λ΄ νΉμ
μ¬μ© μ¬λ‘,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]
λ ν μ μμ΅λλ€. λν λ΄ νΉμ
μ¬μ© μ¬λ‘,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];
}
λ± λͺ¨λ μλνμ§ μμ΅λλ€.
λν νΉμ μ¬μ© μ¬λ‘μμλ λͺ©λ‘μ μ μ μΌλ‘ μ€μ ν μ μμ΅λλ€.
@ 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]
λ ν μ μμ΅λλ€. λν λ΄ νΉμ
μ¬μ© μ¬λ‘,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]; }
λ± λͺ¨λ μλνμ§ μμ΅λλ€.
λν νΉμ μ¬μ© μ¬λ‘μμλ λͺ©λ‘μ μ μ μΌλ‘ μ€μ ν μ μμ΅λλ€.
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
λμ λ릴 μμμ΄μ κΈ°μ©λλ€!
% username % λ, ElementType
μ루μ
μ΄ λΉμ μκ²λ ν¨κ³Όκ° μλ€λ©΄,
λ°°μ΄ ν as const
μμ£Όμνμμμ€. μ€μνλ€
κ°μ₯ μ μ©ν λκΈ
[email protected] μ΄μ. μ΄λ κ² ν΄κ²°ν΄