2017-01-23 3 views
0

Я тестирую FlowJS для своего проекта, и у меня есть проблема с Type Aliases.FlowJS: типы наследования

Я создаю веб-SDK для API: У меня есть Helper класс с этим методом:

class Helper { 
    find(filters:PaginationOptions = {}) { 
     // ... 
    } 
} 

PaginationOptions является основным типом FlowJS:

type PaginationOptions = { 
    start?:string, 
    end?:number, 
}; 

У меня также есть помощник для пользователей , наследуемые от Helper:

class UsersHelper extends Helper { 
    find(filters:UsersFilterOptions = {}) { 
     // ... 
    } 
} 

тип FlowJS «расширение» PaginationOptions:

type UsersFilterOptions = { 
    username?:string, 
    city?:string, 
} & PaginationOptions; 

Я использую здесь в Intersection так, чтобы мои пользователи фильтры должны также принимать start и end свойства.

кажется, что мой IDE (PhpStorm) не нравится мой find() метод из моего класса UsersHelper, он продолжает говорить мне, что:

Несовместимые переопределение, должен иметь тип 'PaginationOptions'

Хорошо ... Я знаю, вот почему UsersFilterOptions имеет перекресток с PaginationOptions.

Но FlowJS также показывает мне два другие предупреждения:

потока: свойство username. Объект не найден в объекте литерал
Поток: свойство city. Свойство не найдено в объекте буквального

Я не понимаю, почему у меня есть эти ошибки: эти свойства определяются как необязательные ...

Есть ли у вас какие-либо предложения для исправления этих трех ошибок?

Заранее благодарен!

+0

@ nat-mote Могу ли я узнать, почему метка 'flow-js' была удалена? Этот вопрос полностью связан с 'flow-js', для меня совершенно бессмысленно удалить этот тег ... – KorHosik

+0

Посмотрите описание этого тега, это для другого проекта, который не является средством проверки потока. Тег для того, что вам нужно, - это тип потока: http://stackoverflow.com/tags/flow-js/info –

+0

Хорошо, спасибо за информацию :) – KorHosik

ответ

2

При переопределении метода, то аргументы должны быть супертипами из соответствующих аргументов в базовом классе, так что вы можете сделать это:

class A { 
    test(x: number) { 
    } 
} 

class B extends A { 
    test(x: number | string) { 
    } 
} 

Но вы не можете сделать это:

class A { 
    test(x: number | string) { 
    } 
} 

class B extends A { 
    test(x: number) { 
    } 
} 
+0

Спасибо, что вы ответили :) Такое поведение довольно странно, на мой взгляд, но почему бы и нет ... Любая идея, как решить мою проблему и сделать компилятор счастливым? – KorHosik

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