给defineEmit的emit事件写个ts校验规则
时间: 2023-10-13 08:24:10 浏览: 41
假设 `defineEmit` 函数定义如下:
```typescript
type EmitFn<T> = (event: keyof T, ...args: any[]) => void;
function defineEmit<T extends Record<string, any>>(): {
emit: EmitFn<T>;
};
```
那么,给 `emit` 事件写的 TypeScript 校验规则可以如下:
```typescript
interface Events {
// 定义事件名称及参数类型
foo: { bar: string };
baz: { num: number, str: string };
}
const { emit } = defineEmit<Events>();
// 触发 `foo` 事件,参数必须是 { bar: string } 类型
emit('foo', { bar: 'hello' });
// 触发 `baz` 事件,参数必须是 { num: number, str: string } 类型
emit('baz', { num: 123, str: 'world' });
// 错误示例,触发 `foo` 事件时传入了错误的参数类型
emit('foo', { num: 123 });
// 错误示例,调用了未定义的事件
emit('qux', { foo: 'bar' });
```
通过将 `Events` 接口定义为事件名称及其参数类型的集合,我们可以在编译期间校验事件名称和参数类型是否正确。对于未定义的事件或错误的参数类型,TypeScript 编译器会直接报错。