Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 - Fatal编程技术网

Typescript 如何正确编写函数签名以接受联合类型的参数?

Typescript 如何正确编写函数签名以接受联合类型的参数?,typescript,Typescript,我试图为API提供一个函数,该函数可以接受类型为a或B的参数。我使用接口来键入参数。这些类型不共享单个成员。我的尝试导致编译器抱怨类型x上不存在属性x export interface MyTypeA { prop1: string; prop2: boolean; } export interface MyTypeB { prop3: number; prop4: string; } doSomething(param1: string, param2: MyTypeA |

我试图为API提供一个函数,该函数可以接受类型为a或B的参数。我使用
接口
来键入参数。这些类型不共享单个成员。我的尝试导致编译器抱怨类型x上不存在属性x

export interface MyTypeA {
  prop1: string;
  prop2: boolean;
} 
export interface MyTypeB {
  prop3: number;
  prop4: string;
}

doSomething(param1: string, param2: MyTypeA | MyTypeB){
  switch(param1){
    case 'a':
    case 'b': {
      const cf = this.resolver.resolveComponentFactory(MyClassAComponent);
      const component = this.wrap.createComponent(cf);
      component.instance.prop1 = param2.prop1;
      component.instance.prop2 = param2.prop2;
      break;
    }
    case 'c': {
      const cf = this.resolver.resolveComponentFactory(MyClassBComponent);
      const component = this.wrap.createComponent(cf);
      component.instance.prop3 = param2.prop3;
      break;
    }

  }
}

我不确定用
接口可以做到这一点,我想我可能不得不使用
类型,但不知道如何使用。

我看到了3种可能的解决方案:

  • param2
    的每个用法进行强制转换
  • 使用
  • 使用
如果将
param1
param2
组合起来对您有意义,我会选择标记的联合体。否则,请使用用户定义的类型保护


我认为有3种可能的解决方案:

  • param2
    的每个用法进行强制转换
  • 使用
  • 使用
如果将
param1
param2
组合起来对您有意义,我会选择标记的联合体。否则,请使用用户定义的类型保护


doSomething
的实现是什么样的?您所拥有的一切都很好,但是实现需要使用类型保护来确定接收到的内容。我过度简化了我的示例,模糊了我的用例。我在这里更新了签名,显示它是签名中两个参数之一。我试图基于
param1
动态创建各种类(角度组件)的实例,然后为实例提供相关的
param2
属性。现在我看了代码,我认为最好创建单独的方法。一些代码将被重复,但代码将获得可读性。尽管如此,我还是想知道如何在将来的案例中正确使用联合类型。
doSomething
like的实现是什么?您所拥有的一切都很好,但是实现需要使用类型保护来确定接收到的内容。我过度简化了我的示例,模糊了我的用例。我在这里更新了签名,显示它是签名中两个参数之一。我试图基于
param1
动态创建各种类(角度组件)的实例,然后为实例提供相关的
param2
属性。现在我看了代码,我认为最好创建单独的方法。一些代码将被重复,但代码将获得可读性。尽管如此,我还是很想知道如何在将来的案例中正确使用联合类型。非常感谢!我感谢你提供如此详细的答复。我绝对最喜欢这种方法。感觉最像打字稿了。非常感谢!我感谢你提供如此详细的答复。我绝对最喜欢这种方法。感觉最像打字脚本。