Я пытаюсь использовать типы разграниченного объединения типов TypScript 2.0 с RxJS, но я получаю сообщение об ошибке, что возвращаемый объект не относится к одному из типов тип объединения.Типы типов с дискриминацией типов с Observable.of
Вот мои типы:
interface Square {
kind: "square";
width: number;
}
interface Circle {
kind: "circle";
radius: number;
}
interface Center {
kind: "center";
}
type Shape = Square | Circle | Center;
Эта функция, когда я просто возвращать Shape
не используя Observable
компилирует полностью нормально:
function shapeFactory(width: number): Shape {
if (width > 5) {
return {kind: "circle", radius: width};
} else if (width < 2) {
return {kind: "square", width: 3};
}
return {kind: "center"};
}
Когда я вместо того, чтобы пытаться возвращать Observable<Shape>
выглядеть примерно так:
function shapeFactoryAsync(width: number): Observable<Shape> {
if (width > 5) {
return Observable.of({kind: "circle", radius: width});
} else {
return Observable.of({kind: "center"});
}
}
Я знаком с wi й ошибки компиляции:
Type 'Observable<{ kind: string; radius: number; }>' is not assignable to type 'Observable<Shape>'.
Type '{ kind: string; radius: number; }' is not assignable to type 'Shape'.
Type '{ kind: string; radius: number; }' is not assignable to type 'Center'.
Types of property 'kind' are incompatible.
Type 'string' is not assignable to type '"center"'.
я ожидаю, что мой первый возврат будет иметь тип Observable<{ kind: "circle"; radius: number; }>
, поскольку kind
является Discriminate во всех Shape
типов. Как ни странно, это нормально с Observable.of({kind: "center"})
, возможно, потому что нет никаких других данных, связанных с ним?
Я могу это исправить, если я явно присвоить объект и назначить задание типа так:
let circle: Circle = {kind: "circle", radius: width};
return Observable.of(circle);
Хотя это, кажется, что это должно быть ненужным приведение.
Я просто делаю это совершенно неправильно или это то, что необходимо для того, чтобы выяснить, что kind
должен быть полезен "circle"
вместо типа string
?
Это потому, что 'Observable.of' является статической функцией? Например, если «subject: Subject», то он должен уметь понимать 'typeof t === T' при вызове' subject.next (t) '? –
lambdabutz
Да. Если у вас был 'Subject' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –
cartant