在Typescript中不同类型参数?

时间:2018-04-11 11:06:47

标签: typescript typescript2.0

TypeScript允许传递不同类型的参数,如:

public getClassesNumbers(classes: ClassesAndSubjects[] | SchoolClass[]) {}

但我在里面的功能只需要SchoolClass[]的{​​{1}}参数类型?

classes

是否必须在内部指定this.functionInside(classes: SchoolClass[], true) 类型?

它强制制作重复的代码。

1 个答案:

答案 0 :(得分:2)

你可以拥有一个接受一个联合类型的函数并调用一个只接受其中一个的函数,你只需要使用一个类型的守护,这样只有在真正调用时才调用该函数参数的类型是函数所期望的:

public getClassesNumbers(classes: ClassesAndSubjects[] | SchoolClass[]) {
    if (classes && (classes[0] instanceof SchoolClass)) {
       // we can safely call functionInside:
       functionInside(classes as SchoolClass[]);
    } else { 
       // ... something ...
    }
}

如果ClassesAndSubjectsSchoolClass是类,则此方法有效。如果它们是接口,则您无法使用instanceof,因此您必须使用不同的类型保护。例如,如果SchoolClass具有someProp没有的属性ClassesAndSubjects

public getClassesNumbers(classes: ClassesAndSubjects[] | SchoolClass[]) {
    if (classes && classes[0] && ('someProp' in classes[0])) {
       // we can safely call functionInside:
       functionInside(classes as SchoolClass[]);
    } else { 
       // ... something ...
    }
}

第三个选项是定义一个真正的类型后卫

function isSchoolClassArray(x: any[]): x is SchoolClass[] {
    return (x !== null && x.length > 0) ? ('someProp' in x[0]): false;
}

public getClassesNumbers(classes: ClassesAndSubjects[] | SchoolClass[]) {
    if (isSchoolClassArray(classes)) {
       // we can safely call functionInside:
       functionInside(classes);
    } else { 
       // ... something ...
    }
}

最后一个选项的优点是TypeScript会知道classesif中的else类型,因此不需要类型断言。

当然,在这两种情况下,如果数组是空的,那么类型保护会失败,但在这种情况下它不重要,因为functionInside也会收到一个空数组