javascript - Hesaplanmış anahtarlara sahip bir Typescript arayüzü tanımlayabilir miyim?
Hesaplanmış anahtarlara sahip bir Typescript arayüzü tanımlamak istiyorum:
const NAMESPACE = 'com.pizza'
const KEY_SAUCE = `${NAMESPACE}/sauce`
const KEY_CRUST = `${NAMESPACE}/crust`
interface PizzaToken {
radius: number
[KEY_SAUCE]: Sauce
[KEY_CRUST]: Crust
}
const pizza: PizzaToken = PizzaFactory.getToken(...)
console.log(pizza[KEY_SAUCE])
Bu tasarım deseni bana iki alakasız Typescript hatası veriyor; ilki, interface üzerinde:
TS1169: A computed property name in an interface must refer to an
expression whose type is a literal type or a 'unique symbol' type.
ve ikincisi pizza[KEY_SAUCE] üzerinde:
TS7053: Element implicitly has an 'any' type because expression of
type 'any' can't be used to index type 'Pizza'.
Bunları bazı geçici çözümlerle (örneğin Symbol) çözebilirim ama biraz hantal oluyorlar. Bunu çalıştırmanın en iyi yolu nedir?
Cevap #1
Anahtar bildirimlerinde genişlemeyen bir string literal türü oluşturmak için as const kullanmanız gerekir:
const KEY_SAUCE = `${NAMESPACE}/sauce` as const;
const KEY_CRUST = `${NAMESPACE}/crust` as const;
