객체를 정의하려고합니다. MDN이 말한 것처럼 기호가 키 유형으로 .
심볼 값은 객체 속성에 대한 식별자로 사용될 수 있습니다 […]
그러나 키 속성의 유형으로 사용하십시오.
type obj = {
[key: symbol | string]: string
}
다음과 같은 오류가 발생합니다.
TS1023 : 색인 서명 매개 변수 유형은 ‘string’또는 ‘number’여야합니다.
심지어는 수 인덱스 형으로 사용 될 수있다. 최신 Typescript 버전 ( v3.7.2
)을 사용하고 있습니다. 관련 질문 :
- 타이프 라이터가 : 키와 같은 기호 객체를 destructuring (그는 기호의 실제 인스턴스를 사용하고, 내가 원하는 타입
symbol
) - TypeScript : 문자열을 사용하려고 할 때 색인 서명 매개 변수는 ‘string’또는 ‘number’여야합니다. 번호
- ES6 : 심볼을 키로 사용하여 객체를 파괴하는 것 (솔루션은 될 수 없습니다-모든 Symbol 인스턴스가 고유하기 때문에 실제 인스턴스를 유형으로 사용하는 것은 다소 잘못된 것 같습니다 …)
또한 typescript 기호 문서를 살펴 보았지만 유형이 아닌 값으로 사용되는 방법 만 보여줍니다.
예:
const obj = {} as {
[key: number | symbol]: string // Won't work
};
const sym = Symbol('My symbol');
obj[sym] = 'Hi';
답변
불행히도 이것은 현재 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