这是一个显示问题核心的简约示例,希望它有助于理解我的情况
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>
感谢您的回复!
答案 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
}
您可以更改变量以使用此虚拟类型。这意味着您在代码的其他部分进行了一些更改,但是从语义上来说应该可以正常工作