首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果映射到arg的类型是未定义的,那么如何使arg成为可选的呢?

如果映射到arg的类型是未定义的,那么如何使arg成为可选的呢?
EN

Stack Overflow用户
提问于 2018-12-01 07:40:54
回答 2查看 57关注 0票数 1

例如,如果我们有以下代码,

代码语言:javascript
运行
复制
type Events = {
    SOME_EVENT: number
    OTHER_EVENT: string
    ANOTHER_EVENT: undefined
}

interface EventEmitter<EventTypes> {
  on<K extends keyof EventTypes>(s: K, listener: (v: EventTypes[K]) => void);
}

declare const emitter: EventEmitter<Events>;

emitter.on('SOME_EVENT', (payload) => testNumber(payload));
emitter.on('OTHER_EVENT', (payload) => testString(payload));

function testNumber( value: number ) {}
function testString( value: string ) {}

哪种方法有效(操场链接,我们如何才能使发出的调用不需要ANOTHER_EVENT事件的第二个arg?)

例如,我可以添加以下行,它可以工作:

代码语言:javascript
运行
复制
emitter.emit('OTHER_EVENT', 'foo')

(操场链接

但是,如果我想用emit调用'ANOTHER_EVENT',我想不使用第二个arg:

代码语言:javascript
运行
复制
emitter.emit('ANOTHER_EVENT') // ERROR, expected 2 arguments, but got 1.

这会产生一个错误,因为它期望第二个arg。(操场链接

为了让它发挥作用,我必须写:

代码语言:javascript
运行
复制
emitter.emit('ANOTHER_EVENT', undefined)

(操场链接

如何使第二个arg不只是在我们用emit调用'ANOTHER_EVENT'的情况下所必需的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-01 08:12:27

您可以在rest参数中使用元组来根据第一个参数更改参数的数量(甚至是它们的可选性)。

代码语言:javascript
运行
复制
type Events = {
    SOME_EVENT: number
    OTHER_EVENT: string
    ANOTHER_EVENT: undefined
}

type EventArgs<EventTypes, K extends keyof EventTypes> = EventTypes[K] extends undefined ?[]:[EventTypes[K]]
interface EventEmitter<EventTypes> {
    on<K extends keyof EventTypes>(s: K, listener: (...v: EventArgs<EventTypes,K>) => void);
    emit<K extends keyof EventTypes>(s: K, ...v: EventArgs<EventTypes,K>);
}

declare const emitter: EventEmitter<Events>;

emitter.on('SOME_EVENT', (payload) => testNumber(payload));
emitter.on('OTHER_EVENT', (payload) => testString(payload));

function testNumber(value: number) {}
function testString(value: string) {}

emitter.emit('OTHER_EVENT', 'foo')

emitter.emit('ANOTHER_EVENT')
票数 1
EN

Stack Overflow用户

发布于 2018-12-01 07:55:29

通过使用?,可以使第二个参数可选

代码语言:javascript
运行
复制
type Events = {
    SOME_EVENT: number
    OTHER_EVENT: string
    ANOTHER_EVENT?: undefined
}

interface EventEmitter<EventTypes> {
    on<K extends keyof EventTypes>(s: K, listener: (v: EventTypes[K]) => void);
    emit<K extends keyof EventTypes>(s: K, v?: EventTypes[K]);
}

declare const emitter: EventEmitter<Events>;

emitter.on('SOME_EVENT', (payload) => testNumber(payload));
emitter.on('OTHER_EVENT', (payload) => testString(payload));

function testNumber(value: number) {}
function testString(value: string) {}

emitter.emit('OTHER_EVENT', 'foo')

emitter.emit('ANOTHER_EVENT')

我不认为根据第一个参数的输入它是可选的。在这种情况下,您只需要两种不同的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53568797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档