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

객체를 정의하려고합니다. 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에서 불가능합니다. 이것을 기대하거나 실제로 기호를 키로 사용하려는 일부 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


답변