如何在Typescript中使用定义为多种类型之一的变量来反对其中一种类型的数组?

时间:2019-05-02 14:22:13

标签: javascript reactjs typescript

这是一个显示问题核心的简约示例,希望它有助于理解我的情况

interface Type1 {value1: number};
interface Type2 {value2: string};

let variable: Type1|Type2;

let variableType1List: Type1[];
let variableType2List: Type2[];

let usingType1: boolean = true;
let variableListPosition: number;

if (usingType1) {
    variable = {value1: 5};
} else {
    variable = {value2: "hello world"};
}

if (usingType1) {
    variableListPosition = variableType1List.indexOf(variable);
} else {
    variableListPosition = variableType2List.indexOf(variable);
}

我收到错误类型'Type1 | “类型2”不可分配给“类型1”类型的参数。 在一行上,类型'Type2'中缺少属性'value1',但在类型'Type1'中是必需的。

variableListPosition = variableType1List.indexOf(variable);

,并且出现错误类型'Type1 | “类型2”不可分配给“类型2”类型的参数。 在一行上的类型'Type1'中缺少属性'value2',但在类型'Type2'中是必需的。

variableListPosition = variableType2List.indexOf(variable);

一件事是,可以通过创建具有共享逻辑的父类,然后为特定类型定义子代来解决此问题。但是我仍然对这样的事情是否可行感到好奇,因为我不时希望允许将多个类型的变量传递到我的函数中,然后以不同的方式使用它们,以使我的类更易于其他程序员使用。 / p>

感谢您的回复!

2 个答案:

答案 0 :(得分:1)

我认为这对您来说不是问题。在您的示例中,每次键入都很有意义。出问题的是TS的股票类型.indexOf()仅接受数组元素类型的 参数,这显然对我来说是一个过大的约束。

这就像要求isString()仅将string作为参数一样,我的意思是,如果我知道它是string,那么就根本不需要调用它。同样,.indexOf通常被用作一种测试方法,将它用于任何事物都很好。

我的建议,只需使用as any即可解决问题。

variableListPosition = variableType2List.indexOf(variable as any);

或者,您也可以使用声明合并来修改TS stock lib的类型。幸运的是,indexOf是一个函数,您可以毫无问题地添加重载签名。

declare global {
    interface Array<T> {
        indexOf(searchElement: any, fromIndex?: number): number
    }
}

答案 1 :(得分:-1)

我们需要更多有关您的问题的见解,但以下一些方法可能会有所帮助:

interface Dummy {
   type1Value?: Type1
   type2Value?: Type2
}

您可以更改变量以使用此虚拟类型。这意味着您在代码的其他部分进行了一些更改,但是从语义上来说应该可以正常工作