typescript - 如何推断泛型参数的属性类型并映射到另一种类型

标签 typescript

testFunc1正在使用 SomeMapper并获得正确的通用参数。
testFunc2下面我尝试使用映射类型作为函数参数,但由于某种原因 SomeMapper 得到了错误的泛型参数。
我怎样才能得到{ name: 'match' }作为 listener 的函数参数?

type SomeMapper<T> = { [K in keyof T]: 'A' extends T[K] ? 'match' : 'no-match' }

function testFunc1<T extends Record<string, { params: Record<string, string> }>>(
  args: T & { [K in keyof T]: { listener: SomeMapper<T[K]['params']> } }
) {}

const test1 = testFunc1({
  someEvent: {
    params: { name: 'A' as const },
    listener: { name: 'match' } // type mapping with SomeMapper works!
  }
})

function testFunc2<T extends Record<string, { params: Record<string, string> }>>(
  args: T & { [K in keyof T]: { listener: (args: SomeMapper<T[K]['params']>) => unknown } }
) {}

const test2 = testFunc2({
  someEvent: {
    params: { name: 'A' as const },
    listener: (args /* args = SomeMapper<Record<string, string>> */) => {
      // 'args' should be { name: 'match' }

      return
    }
  }
})

最佳答案

我相信你可以这样做

type SomeMapper<T> = { [K in keyof T]: 'A' extends T[K] ? 'match' : 'no-match' }

type ListenerDecl<T> = {
  params: T;
  listener: (args: SomeMapper<T>) => unknown
}

function testFunc2<T extends Record<string, unknown>>(
  args: { [K in keyof T]: ListenerDecl<T[K]> }
) { }


const test2 = testFunc2({
  someEvent: {
    params: { name: 'A' as const },
    listener: (args) => {
      // 'args' should be { name: 'match' }
      return
    }
  }
})

关于typescript - 如何推断泛型参数的属性类型并映射到另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64809051/

相关文章:

angular - 试图通过 suppressExcessPropertyErrors 编译器选项来抑制 TS2339

angular - 如何将 popper 与 Angular 一起使用

javascript - 使用对话框中的输入订阅可观察的异步 map 结果,使用 map 结果来路由

javascript - cucumber JS : Custom parameter types not matching

angular - 触发最近文本框获得焦点的按钮的点击事件

angular - "' @param ' is redundant in TypeScript code if it has no description."TSLint 错误?

javascript - 为什么 typescript 类中的这种结构在编译正常时会导致运行时错误?

Typescript 从默认值推断泛型类型

javascript - Angular 路由仅有时有效

javascript - 在 Canvas 上播放 Sprite 表的速度比帧速率慢