reactjs - React.FunctionalComponent üzerinde TypeScript ile statik enum declare etmek
Statik özelliklere sahip bir React.FunctionalComponent’im var, yani:
import MyAwesomeComponent from './MyAwesomeComponent';
...
<MyAwesomeComponent mode={MyAwesomeComponent.modes.superAwesome} />
Statik özellikler anahtar-değer haritalarıdır:
MyAwesomeComponent.modes = {
superAwesome: 'super-awesome',
almostAwesome: 'almost-awesome',
regular: 'regular',
}
Böyle bileşenler için .d.ts dosyasını nasıl yazabilirim?
Enum oluşturmayı denedim ve sonra bunu StaticProps olarak dışa aktarmaya eklemeyi denedim:
enum modes {
superAwesome = 'super-awesome',
almostAwesome = 'almost-awesome',
regular = 'regular',
}
interface MyAwesomeComponentProps {
mode: modes,
}
interface StaticProps {
modes: Record<modes, modes>,
}
declare const MyAwesomeComponent: React.FC<MyAwesomeComponentProps> & StaticProps;
export default MyAwesomeComponent;
Ama tire içeren mod-değerlerinde başarısız oluyor, yani 'super-awesome'
Böyle bileşenleri nasıl yazabilirim ki camelCase anahtarlarını kullanabileyim ve imleci üzerine getirdiğimde tireli değeri görebileyim?
GÜNCELLEME: Çözüm bulundu! Teşekkürler, aleksey-l!
UPD2: Bazı bileşenlerim fonksiyon olarak tanımlanmıştır, yani:
declare namespace MyAwesomeComponent {
declare enum modes {
superAwesome = 'super-awesome',
almostAwesome = 'almost-awesome',
regular = 'regular',
}
}
interface MyAwesomeComponentProps {
mode: MyAwesomeComponentProps.modes,
}
declare function MyAwesomeComponent(props: PropsWithChildren<MyAwesomeComponentProps): JSX.Element;
export default MyAwesomeComponent;
Ve @typescript-eslint/no-unsafe-assignment ve @typescript-eslint/no-unsafe-member-access eslint hatalarını almaya başlıyorum
<MyAwesomeComponent mode={MyAwesomeComponent.modes.superAwesome} />
Cevap #1
Record<modes, modes>, hem anahtarlar hem de değerler olarak mode değerlerine ('super-awesome' | 'almost-awesome' | 'regular') sahip bir tür üretir. Aradığınız şey, typeof operatörü ile sorgulanabilen enum nesnesinin gerçek türüdür:
interface StaticProps {
modes: typeof modes,
}
Oyun alanı
Sadece referans için başka bir seçenek - normal tip takma adını kullanmak:
type Modes = {
superAwesome: 'super-awesome',
almostAwesome: 'almost-awesome',
regular: 'regular',
}
interface MyAwesomeComponentProps {
mode: Modes[keyof Modes],
}
interface StaticProps {
modes: Modes,
}
Oyun alanı
