我正在创建一堆 Web 组件,每个组件都可以发出自定义事件。举个例子,以下是两个简单的示例:
//MyButton
emits 'myButtonPressed' and detail of this type:
interface ButtonDetailType {
id: string;
}
//MySlider
emits 'mySliderChanging' and details of this type:
interface SliderChangingDetailType {
id: string;
value: number;
}
emits 'mySliderChanged' and details of this type:
interface SliderChangedDetailType {
id: string;
oldValue: number;
newValue: number;
}
听取组件的代码如下:
buttonEl.addEventListener( 'myButtonPressed', ( event : CustomEvent ) => {
const detail = event.detail as ButtonDetailType;
//now i have access to detail.id
} );
sliderEl.addEventListener( 'mySliderChanging', ( event : CustomEvent ) => {
const detail = event.detail as SliderChangingDetailType;
//now i have access to detail.id, detail.value
} );
随着我创建更多的组件,我很难记住每个组件可以发射的自定义事件名称或每个事件生成的详细类型。
为了解决这个问题,我希望创建一个包含所有信息的对象,就像这样:
EVENTS = {
button: {
myButtonPressed: 'myButtonPressed',
detailType: 'ButtonDetailType',
},
slider: {
mySliderChanged': 'mySliderChanged',
detailTypes: {
'SliderChangedDetailType',
'SliderChangingDetailType',
}
}
};
有了这个,我现在可以轻松地访问每个组件可用的所有事件名称,并且在我输入时自动完成会帮助我:
buttonEl.addEventListener( EVENTS.button. //autocomplete shows me all event names here! YAY!
sliderEl.addEventListener( EVENTS.slider. //autocomplete here too!
我现在遇到的问题是我不知道如何将字符串转换为类型。我想输入以下内容:
buttonEl.addEventListener( EVENTS.button.myButtonPressed, ( event : CustomEvent ) => {
const detail = event.detail as EVENTS.button.detailType; // <- invalid: EVENTS.button.detailType is a string not a type!
} );
在 TypeScript 中,有没有一种将字符串转换为类型的方法?