通用扩展参数不能分配给参数类型

用户名

我试图extends在通用参数中使用索引对象,但出现以下错误:

“ IHandlerMap [K]”类型的参数不能分配给“ BasicHandler”类型的参数。输入'BasicHandler | “ KeyPressHandler”不能分配给“ BasicHandler”类型。类型'KeyPressHandler'不能分配给类型'BasicHandler'.ts(2345)

码:

export type BasicHandler = () => void;
export type KeyPressHandler = (keyCode: number) => void;

interface IHandlerMap {
  OnTick: BasicHandler;
  OnKeyDown: KeyPressHandler;
}

type HandlersType = {[key in keyof IHandlerMap]: IHandlerMap[key][]};

export class EventManager {
  private readonly handlers: HandlersType = {
    OnTick: [],
    OnKeyDown: [],
  };

  public addHandler<K extends keyof IHandlerMap>(
    type: K,
    handler: IHandlerMap[K]
  ): {
    this.handlers[type].push(handler); // Error is occuring here.
  }
}

看来,TS只能BasicHandler在可以为BasicHandlerOR推断出对象属性是类型数组KeyPressHandler

如何使用keyof索引接口(handler: IHandlerMap[K]),然后使用该参数来推送到也为type'd(this.handlers[type].push(handler)?)的对象键

我在解释我要做什么时遇到很多麻烦,这是做这件事的错误方法吗?如果是这样,有什么替代方法?

福特04

我的猜测是,表达式类型this.handlers[type]触发您的错误:

addHandler函数体内,我们不知道两个值"OnTick""OnKeyDown"属性中的哪个type,因此假定其基本类型keyof IHandlerMap"OnTick" | "OnKeyDown"属性访问权限。属性访问this.handlers[type]将解决的类型HandlersType[keyof IHandlerMap],这是BasicHandler[] | KeyPressHandler[]

现在,当我们调用时this.handlers[type].pushpush可以使用BasicHandler[]调用方法KeyPressHandler[],因此其类型是这两种方法并集push

| (...items: BasicHandler[]): number 
| (...items: KeyPressHandler[]): number

从TS 3.3开始,您实际上可以调用联合类型的函数,但是它们的参数是相交的&)。push签名看起来有点像这样:

(method) Array<T>.push(items: (BasicHandler & KeyPressHandler)[]): number

BasicHandler没有功能参数,KeyPressHandler一个。因此,交集导致...没有预期参数。您可以添加一个参数一样s: stringBasicHandler和它得到更明显(悬停在push当时)。

我们能做些什么?

将额外的变量用于this.handlerstypeHandlersTypeMixedthis.handlers直接将其用于注:(BasicHandler | KeyPressHandler)[] !== BasicHandler[] | KeyPressHandler[]只有前者不会产生联合函数类型,并允许使用push操场

type HandlersTypeMixed = { [key in keyof IHandlerMap]: (BasicHandler | KeyPressHandler)[] }

public addHandler<K extends keyof IHandlerMap>(
    type: K,
    handler: IHandlerMap[K]
) {
    const hs: HandlersTypeMixed  = this.handlers
    hs[type].push(handler);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

参数类型“对象”不能分配给参数类型“ System.Windows.Forms.Control”

来自分类Dev

参数类型“ A”不能分配给类型“ B”吗?

来自分类Dev

尽管参数类型继承,但不能分配给参数类型

来自分类Dev

参数类型“ CheckIn”不能分配给参数类型“()-> CheckIn”

来自分类Dev

参数类型不能分配给参数类型,应为

来自分类Dev

类型'this'的参数不能分配给'工具'类型的参数

来自分类Dev

多层通用类型的返回值不能分配给扩展类型

来自分类Dev

Angular + Chart.js /类型'ChartPoint'的参数不能分配给'number&ChartPoint'类型的参数

来自分类Dev

Typescript枚举键入错误(类型'string'的参数不能分配给类型的参数)

来自分类Dev

类型'“”'的参数不能分配给类型'“ prototype”'茉莉的参数

来自分类Dev

React Typescript-类型的参数不能分配给类型的参数

来自分类Dev

参数类型'GeneratedIntColumn'不能分配给参数类型'int':Moor-Flutter

来自分类Dev

“字符串类型的参数不能分配给自定义类型的参数”的难看的问题

来自分类Dev

类型“ X”的参数不能分配给类型“ Y”的参数

来自分类Dev

类型“ {}”的参数不能分配给Angular 8中的类型的参数

来自分类Dev

导致ts错误。类型““ long”'的参数不能分配给类型'TextDataTypeOptions'的参数

来自分类Dev

类型'number'的参数不能分配给array.includes()中类型'never'的参数

来自分类Dev

参数类型'jsObject'不能分配给'buildContext'参数吗?

来自分类Dev

用Typescript进行反应:类型'never []'的参数不能分配给类型'StateProperties |的参数。(()=> StateProperties)'

来自分类Dev

“预订”类型的参数不能分配给“功能”类型的参数

来自分类Dev

类型的参数不能分配给类型“ MiddlewareFunc”的参数。app.use(oakCors());

来自分类Dev

ts(2345)类型'any'的参数不能分配给'never'类型的参数

来自分类Dev

类型'InputType []'的参数不能分配给类型'GenericType []'的参数

来自分类Dev

参数类型'Future <>'不能分配给参数类型''

来自分类Dev

类型“ Response”的参数不能分配给类型“ SetStateAction”的参数

来自分类Dev

“1”类型的参数不能分配给“number[]”类型的参数

来自分类Dev

'true' 类型的参数不能分配给类型的参数

来自分类Dev

Gulp:'function ()' 不能分配给参数

来自分类Dev

“Params”类型的参数不能分配给“string”类型的参数

Related 相关文章

  1. 1

    参数类型“对象”不能分配给参数类型“ System.Windows.Forms.Control”

  2. 2

    参数类型“ A”不能分配给类型“ B”吗?

  3. 3

    尽管参数类型继承,但不能分配给参数类型

  4. 4

    参数类型“ CheckIn”不能分配给参数类型“()-> CheckIn”

  5. 5

    参数类型不能分配给参数类型,应为

  6. 6

    类型'this'的参数不能分配给'工具'类型的参数

  7. 7

    多层通用类型的返回值不能分配给扩展类型

  8. 8

    Angular + Chart.js /类型'ChartPoint'的参数不能分配给'number&ChartPoint'类型的参数

  9. 9

    Typescript枚举键入错误(类型'string'的参数不能分配给类型的参数)

  10. 10

    类型'“”'的参数不能分配给类型'“ prototype”'茉莉的参数

  11. 11

    React Typescript-类型的参数不能分配给类型的参数

  12. 12

    参数类型'GeneratedIntColumn'不能分配给参数类型'int':Moor-Flutter

  13. 13

    “字符串类型的参数不能分配给自定义类型的参数”的难看的问题

  14. 14

    类型“ X”的参数不能分配给类型“ Y”的参数

  15. 15

    类型“ {}”的参数不能分配给Angular 8中的类型的参数

  16. 16

    导致ts错误。类型““ long”'的参数不能分配给类型'TextDataTypeOptions'的参数

  17. 17

    类型'number'的参数不能分配给array.includes()中类型'never'的参数

  18. 18

    参数类型'jsObject'不能分配给'buildContext'参数吗?

  19. 19

    用Typescript进行反应:类型'never []'的参数不能分配给类型'StateProperties |的参数。(()=> StateProperties)'

  20. 20

    “预订”类型的参数不能分配给“功能”类型的参数

  21. 21

    类型的参数不能分配给类型“ MiddlewareFunc”的参数。app.use(oakCors());

  22. 22

    ts(2345)类型'any'的参数不能分配给'never'类型的参数

  23. 23

    类型'InputType []'的参数不能分配给类型'GenericType []'的参数

  24. 24

    参数类型'Future <>'不能分配给参数类型''

  25. 25

    类型“ Response”的参数不能分配给类型“ SetStateAction”的参数

  26. 26

    “1”类型的参数不能分配给“number[]”类型的参数

  27. 27

    'true' 类型的参数不能分配给类型的参数

  28. 28

    Gulp:'function ()' 不能分配给参数

  29. 29

    “Params”类型的参数不能分配给“string”类型的参数

热门标签

归档