Я только что узнал метод использования различающего кортежа в качестве параметра из ответа на этот вопрос , но, когда я попробовал концепцию на некоторых из моих старых кодов, я обнаружил, что не могу его получить работать как я ожидал. Рассмотрим следующий пример:
class Fraction {
constructor(r: Rational) {
/* Not important */
}
}
type Rational = number | Fraction;
class Couple {
private _x: Fraction;
private _y: Fraction;
constructor(c: Couple);
constructor(x: Rational, y: Rational);
constructor(...r: [Couple] | [Rational, Rational]) {
if(r[0] instanceof Couple) r = [r[0]._x, r[0]._y]; // pay attention here
this._x = new Fraction(r[0]);
this._y = new Fraction(r[1]);
}
}
Я ожидаю, что после указанной выше строки TypeScript должен сделать вывод, что r
может быть только типа [Rational, Rational]
и не должен иметь проблем со следующими двумя строками, но это не так. Почему это так и как я могу это исправить, все еще используя идею кортежа?