2017-01-03 8 views
3

Я пытаюсь использовать типы разграниченного объединения типов 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?

ответ

2

С вызовом типа Observable.of({ kind: "center" }), TypeScript не может вывести тип из анонимного аргумента.

Вы можете решить вашу проблему, указав type variable, как Shape при вызове родового of метода:

function shapeFactoryAsync(width: number): Observable<Shape> { 
    if (width > 5) { 
    return Observable.of<Shape>({ kind: "circle", radius: width }); 
    } else { 
    return Observable.of<Shape>({ kind: "center" }); 
    } 
} 

С переменной типа указан, машинописи больше не нужно определить тип.

+0

Это потому, что 'Observable.of' является статической функцией? Например, если «subject: Subject », то он должен уметь понимать 'typeof t === T' при вызове' subject.next (t) '? – lambdabutz

+0

Да. Если у вас был 'Subject ' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – cartant

 Смежные вопросы

  • Нет связанных вопросов^_^