繁体   English   中英

如何将泛型参数和 map 的属性类型推断为另一种类型

[英]How to infer property type of generic parameter and map to another type

testFunc1正在使用SomeMapper并获取正确的通用参数。

在下面的testFunc2中,我尝试使用映射类型作为 function 参数,但由于某种原因,SomeMapper 得到了错误的通用参数。

如何获得{ name: 'match' }作为listener的 function 参数?

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
    }
  }
})
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
    }
  }
})

我试过了,它没有任何错误。 如果这有效,那么我为你感到高兴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM