Typescript 中的不同类型参数?

Differs type parameters in Typescript?

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

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

但是我在里面的函数只需要 SchoolClass[] 参数类型 classes?

this.functionInside(classes: SchoolClass[], true)

是否必须在函数内部指定 ClassesAndSubjects[] | SchoolClass[] 类型?

强制复制代码。

你可以有一个接受联合类型的函数并在内部调用一个只接受其中之一的函数,你只需要使用一个类型保护,这样这个函数就是仅当参数的真实类型是该函数所期望的类型时调用:

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 有 属性 somePropClassesAndSubjects 没有:

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 会知道 ifelse 中的 classes 类型,因此不需要类型断言。

当然,在这两种情况下,如果数组为空,类型保护将失败,但在那种情况下,这无关紧要,因为 functionInside 也会收到一个空数组