TypeScript에서 심볼을 객체 키 유형으로 사용


20

객체를 정의하려고합니다. MDN이 말한 것처럼 기호가 키 유형으로 .

심볼 값은 객체 속성에 대한 식별자로 사용될 수 있습니다 [...]

그러나 키 속성의 유형으로 사용하십시오.

type obj = {
    [key: symbol | string]: string
}

다음과 같은 오류가 발생합니다.

TS1023 : 색인 서명 매개 변수 유형은 'string'또는 'number'여야합니다.

심지어는 인덱스 형으로 사용 될 수있다. 최신 Typescript 버전 ( v3.7.2)을 사용하고 있습니다. 관련 질문 :

또한 typescript 기호 문서를 살펴 보았지만 유형이 아닌 값으로 사용되는 방법 만 보여줍니다.

예:

const obj = {} as {
    [key: number | symbol]: string // Won't work
};

const sym = Symbol('My symbol');
obj[sym] = 'Hi';

Microsoft / TypeScript 관련 문제

공개 기능 요청


TypeScript는 객체 유형 선언에서 특정 기호 만 지원한다고 생각합니다. 당신은 정말 하시겠습니까 어떤 symbol ? 어쩌면 당신이 어떻게 사용하고 싶은지에 대한 예를 보여줄 수 있습니다 type obj-나는 모든 심볼 키 속성이 strings 가 될지 의심합니다 .
Bergi

@ Bergi 예를 추가했습니다. 어쩌면 뭔가를 감독했지만 기호를 허용하도록 ts를 가져올 수있는 방법을 찾을 수 없습니다 ( any나쁜 연습 을 사용하지 않고 ).
Simon


올바른지 확실하지 않지만 Map<Symbol,String>Map이있는 상태에서 사용하려고 한다면, 달성하려는 목적을 달성 할 수 있다면
pavan kumar

나에게도 같은 문제는 짜증나는 부분이 "TS가 JS의 수퍼 셋"이라는 잘못된 광고라고 생각한다. 이것은 그 완벽한 예입니다.
패트릭

답변:


3

불행히도 이것은 현재 TypeScript에서 불가능합니다. 이것을 기대하거나 실제로 기호를 키로 사용하려는 일부 API와 상호 운용 해야하는 경우이 어색한 버전을 수행 할 수 있습니다.

// Ensure we can not pass regular map to our custom functions
type SymbolMapTag = { readonly symbol: unique symbol }

type SymbolMap = SymbolMapTag & {
    [Key in string | number | symbol]: string;
}

function set_symbol<T extends SymbolMap, TSym extends symbol>
(target: T, sym: TSym, value: T[TSym]) {
    target[sym] = value;
}

function get_symbol<T extends SymbolMap, TSym extends symbol>
(target: T, sym: TSym): T[TSym] {
    return target[sym];
}

const symbol_map = {} as SymbolMap;

const sym = Symbol('My symbol');
set_symbol(symbol_map, sym, "hi");
get_symbol(symbol_map, sym); // string


type NonSymbolMap = {
    [Key in string | number]: string;
}

const non_symbol_map = {} as NonSymbolMap;
set_symbol(non_symbol_map, sym, "hi"); // error
get_symbol(non_symbol_map, sym); // error
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.