typescript 第二个可选参数的类型脚本泛型

cvxl0en2  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(139)

typescript 中的泛型对我来说是相当高级的。但是我设法让它工作起来了

export type Events = {
  LOGIN: undefined
  NAVIGATION: {
    screen: string
  }
  SUPPORT: {
    communication_method: 'chat' | 'email' | 'phone'
  }
}

export function trackEvent<K extends keyof Events>(eventName: K, eventValues: Events[K]) {
  if (Platform.OS === 'web') return
  logEvent(eventName, eventValues ?? {})
}

trackEvent('LOGIN', undefined) // no TS error
// is there a way to make this work with just trackEvent('LOGIN') 

trackEvent('SUPPORT') // 👍 TS error because missing 2nd argument
trackEvent('SUPPORT', { communication_method: 'chat' }) // TS helps writing this

但是想知道是否有一种方法可以使这个工作,只有trackEvent('LOGIN')没有错误和trackEvent('SUPPORT')有错误?

snvhrwxg

snvhrwxg1#

我们可以使用一个 *rest参数 *。如果Events[K]的类型是undefined,则rest参数的类型求值为空元组。空元组禁止向函数传递其他参数。如果您仍然希望能够提供undefined,则可以选择将其替换为[undefined?]

export function trackEvent<K extends keyof Events>(
  eventName: K, 
  ...[eventValues]: (Events[K] extends undefined ? [] : [Events[K]])
) {
  if (Platform.OS === 'web') return
  logEvent(eventName, eventValues ?? {})
}

trackEvent('LOGIN', undefined)
//                  ~~~~~~~~~ Expected 1 arguments, but got 2

trackEvent('SUPPORT')
//          ~~~~~~~ Expected 2 arguments, but got 1

trackEvent('LOGIN') // 👍
trackEvent('SUPPORT', { communication_method: 'chat' }) // 👍

Playground

相关问题