Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 在函数类型的成员变量中具有多个函数签名_Typescript_Typescript Typings_Typescript Class - Fatal编程技术网

Typescript 在函数类型的成员变量中具有多个函数签名

Typescript 在函数类型的成员变量中具有多个函数签名,typescript,typescript-typings,typescript-class,Typescript,Typescript Typings,Typescript Class,为什么“handler”函数变量不可能有多个签名 以这个理想但无效的代码段为例: class MyEntityService { private handleThing: (a: undefined) => undefined; private handleThing: <T extends object>(a: T) => T; private handleThing: <T extends object>(a: T | undef

为什么“handler”函数变量不可能有多个签名

以这个理想但无效的代码段为例:

class MyEntityService {

    private handleThing: (a: undefined) => undefined;
    private handleThing: <T extends object>(a: T) => T;
    private handleThing: <T extends object>(a: T | undefined) => object | T {
        if (!a) return undefined;
        // Various calls to other private methods here
        return a;
    }
}
只有
把手:(a:T |未定义)=>对象|未定义
并不理想:

  • 它没有像我需要的那样映射到实际函数的签名,也就是说,当我的输入不为null时,我的返回类型肯定也不为null;及
  • 我在类中定义的其他一些方法期望提供和接收非null对象,因此上面键入的处理程序函数不能用于每个承诺或事件处理程序
  • 一种选择是使用
    async
    函数,并删除处理函数变量,但这将违背我的团队为我遇到这个难题的项目建立的既定代码约定

    因此,我要求:

  • 有没有更好的方法来实现我在TypeScript的处理函数变量中保持类型安全的目标
  • 有人知道为什么第一个片段不起作用吗
  • 第一个代码片段是否有可能在某一天起作用(即路线图中的联合函数签名选择)

  • 要使第一个代码段正常工作,需要将
    handleThing
    视为一个初始化属性,而不是一个方法;这意味着您给它一个类型注释和一个值。注意,重载函数的类型可以表示为每个签名的类型(例如,
    ((x:string)=>number)&((x:number)=>string)
    ),或者表示为具有多个签名的单个对象类型(例如,
    {(x:string):number;(x:number):string;}
    )。像这样:

    class MyEntityService {
      private handleThing: {
        (a: undefined): undefined;
        <T extends object>(a: T): T;
      } = <T extends object>(a: T | undefined) => {
        if (!a) return undefined;
        // Various calls to other private methods here
        return a;
      }
    }
    
    因为
    (x:undefined)=>如果让
    T
    对象
    未定义
    上都有范围,则未定义的
    应该与该签名匹配


    无论如何,希望这有帮助;祝你好运

    你不使用
    (a:t)=>t
    有什么原因吗?也许我输入函数的方式不对,但我记得在承诺链和接口继承方面有问题(这是我的预期用途,例如
    promise.then(this.handler1)。然后(this.handler2)。然后(…)
    )。我记得尝试过你的第二个建议,但是我在使用带有承诺链的变量时偶然发现了一些语法错误,例如
    promise.then(this.handleThing)
    。不知道发生了什么;也许我做错了什么,但我可以再试一次。另外,不知道3.4引入了这样的支持,可能值得更新,即使不考虑这个具体问题。第一个建议是可靠的;我已经试过类似的方法了,但不是完全按照你的建议。无论如何,这是一个巨大的帮助,非常感谢!
    class MyEntityService {
      private handleThing: {
        (a: undefined): undefined;
        <T extends object>(a: T): T;
      } = <T extends object>(a: T | undefined) => {
        if (!a) return undefined;
        // Various calls to other private methods here
        return a;
      }
    }
    
    class MyEntityService {
      private handleThing = <T extends object | undefined>(a: T): T => {
        if (!a) return undefined as T; // have to assert here
        // Various calls to other private methods here
        return a;
      }
    }