TypeScript'te sembolü nesne anahtarı türü olarak kullanma


20

MDN söylediği için sembollü bir nesneyi anahtar türü olarak tanımlamaya çalışıyorum :

Bir sembol değeri nesne özellikleri için tanımlayıcı olarak kullanılabilir [...]

Ancak bunu anahtar özellik için tür olarak kullanmak:

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

aşağıdaki hatayla sonuçlanır:

TS1023: Bir dizin imzası parametre türü 'dize' veya 'sayı' olmalıdır.

Hatta yapabilirsiniz endeksi-türü olarak kullanılabilir. v3.7.2Bulduğum ilgili en son typescript sürümünü ( ) kullanıyorum :

Ayrıca daktilo sembol dokümanlar bir göz attım ama onlar sadece nasıl değer olarak kullanıldığını, türü olarak gösterir.

Misal:

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

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

Microsoft / TypeScript ile ilgili sorun

Özellik isteğini aç


TypeScript yalnızca nesne türü bildirimlerinde belirli sembolleri desteklediğini düşünüyorum. Gerçekten istiyor musunuz herhangi symbol ? Belki senin nasıl kullanmak istediğine bir örnek göster type obj- Tüm sembol anahtarlı özelliklerin strings olacağından şüpheliyim .
Bergi

@Bergi Bir örnek ekledim, belki bir şey denetledim ama ts'i bir sembolü kabul etmenin bir yolunu bulamıyorum ( anyki bu kötü uygulama kullanmadan).
Simon


doğru olup olmadığımdan emin değilim ama Map<Symbol,String>
Harita'mız olarak kullanmayı denediniz

Benim için aynı sorun, sanırım sinir bozucu kısmı "TS JS bir süper set" nasıl yanlış reklam - iyi, tam olarak değil. bunun mükemmel bir örneği.
Patrick

Yanıtlar:


3

Ne yazık ki bu şu anda TypeScript'te mümkün değil. Bunu bekliyoruz ya da bazı API'leri ile birlikte çalışmasına varsa gerçekten anahtarları gibi semboller kullanmak istiyorum, bu garip sürümü yapabilirsiniz:

// 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.