내가 목록이 있다고 말해
const list = ['a', 'b', 'c']
이 값 유니온 유형에서 파생 될 수 'a' | 'b' | 'c'
있습니까?
정적 배열의 값만 허용하는 유형을 정의하고 런타임에 이러한 값을 열거해야하기 때문에 이것을 원하므로 배열을 사용합니다.
인덱싱 된 객체로 구현할 수있는 방법의 예 :
const indexed = {a: null, b: null, c: null}
const list = Object.keys(index)
type NeededUnionType = keyof typeof indexed
색인 된지도를 사용하지 않고 할 수 있는지 궁금합니다.
답변
2019 년 2 월 업데이트
2019 년 3 월에 출시 될 TypeScript 3.4 에서는 리터럴 구문 을 사용하여 리터럴 튜플 대신 리터럴 튜플 유형을 추론하도록 컴파일러에 지시 할 수 있습니다 . 이 유형의 어설 션은 컴파일러가 모든 것을 만드는 것을 포함하여 값에 대해 가능한 가장 좁은 유형을 추론하도록합니다 . 다음과 같이 표시되어야합니다.string[]
as const
readonly
const list = ['a', 'b', 'c'] as const; // TS3.4 syntax
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c';
이것은 모든 종류의 도우미 기능에 대한 필요성을 제거합니다. 모두에게 다시 행운을 빕니다!
2018 년 7 월 업데이트
TypeScript 3.0부터는 TypeScript가 튜플 유형 을 자동으로 추론 할 수 있습니다 . 릴리스되면 tuple()
필요한 함수를 다음과 같이 간결하게 작성할 수 있습니다.
export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;
그리고 다음과 같이 사용할 수 있습니다.
const list = tuple('a','b','c'); // type is ['a','b','c']
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'
사람들을위한 희망!
2017 년 12 월 업데이트
이 답변을 게시 한 이후 라이브러리에 함수를 추가하려는 경우 튜플 유형을 추론하는 방법을 찾았습니다. tuple.ts 의 함수 tuple()
를 확인하십시오 . 그것을 사용하면 다음을 작성할 수 있으며 반복하지 않을 수 있습니다.
const list = tuple('a','b','c'); // type is ['a','b','c']
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'
행운을 빕니다!
2017 년 7 월 원본
한 가지 문제는 리터럴 ['a','b','c']
이 type으로 추론 string[]
되므로 유형 시스템이 특정 값을 잊어 버린다는 것입니다. 유형 시스템이 각 값을 리터럴 문자열로 기억하도록 강제 할 수 있습니다.
const list = ['a' as 'a','b' as 'b','c' as 'c']; // infers as ('a'|'b'|'c')[]
또는 더 나은 방법은 목록을 튜플 유형으로 해석하는 것입니다.
const list: ['a','b','c'] = ['a','b','c']; // tuple
이것은 성가신 반복이지만 적어도 런타임에 불필요한 객체를 도입하지는 않습니다.
이제 다음과 같이 조합을 얻을 수 있습니다.
type NeededUnionType = typeof list[number]; // 'a'|'b'|'c'.
도움이되기를 바랍니다.
답변
TypeScript 3.4 업데이트 :
TypeScript 3.4에 도착할 “const contexts” 라는 새로운 구문 은 설명 된대로 함수 호출이 필요하지 않은 더 간단한 솔루션을 허용합니다. 이 기능은 이 PR에서 볼 수 있듯이 현재 검토 중 입니다.
요컨대,이 구문은 좁은 유형 (즉, 또는 ['a', 'b', 'c']
대신 유형)을 가진 불변 배열을 생성 할 수 있도록합니다 . 이렇게하면 아래와 같이 쉽게 리터럴에서 공용체 유형을 만들 수 있습니다.('a' | 'b' | 'c')[]
string[]
const MY_VALUES = <const> ['a', 'b', 'c']
type MyType = typeof MY_VALUES[number]
대체 구문에서 :
const MY_VALUES = ['a', 'b', 'c'] as const
type MyType = typeof MY_VALUES[number]
답변
Array에서는이 작업을 수행 할 수 없습니다.
그 이유는 변수를 const로 선언하더라도 배열의 내용은 여전히 변경 될 수 있으므로 @jonrsharpe는 이것이 런타임이라고 언급합니다.
원하는 것이 주어지면 다음 interface
과 함께 사용 하는 것이 더 좋습니다 keyof
.
interface X {
a: string,
b: string
}
type Y = keyof X // Y: 'a' | 'b'
또는 enum
:
enum X { a, b, c }