Смущает конструктор Rxjs Observable и аргумент 'this' - PullRequest
0 голосов
/ 26 февраля 2019

Я тестирую использование Rxjs 6.3.3 в тесте Jasmine в приложении Angular 7.2.Я пытаюсь создать Rxjs Observable, но у меня возникают ошибки, которые я не понимаю.

Сигнатура функции конструктора Rxjs Observable -

constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic);

В тесте ЖасминаЯ пытаюсь создать экземпляр Observable, для этого мне нужно передать определение лямбда-выражения в сигнатуре конструктора.Следующий синтаксис:

const obs = new Observable<number>((this: Observable<number>, s: Subscriber<number>): TeardownLogic => {});

... терпит неудачу с

"error TS2730: An arrow function cannot have a 'this' parameter."

Что я не понимаю, потому что в сигнатуре функции конструктора определение функции стрелки объявлено с 'this'аргумент, не будучи проблемой.

Этот второй синтаксис:

const obs = new Observable((o: Observable<{}>, s: Subscriber<{}>): TeardownLogic => {});

... завершается неудачно с

"error TS2345: Argument of type '(o: Observable<number>, s: Subscriber<number>) => TeardownLogic' is not assignable to parameter of type '(this: Observable<number>, subscriber: Subscriber<number>) => TeardownLogic'"

Что я нахожу запутанным, поскольку две сигнатуры функций в сообщении об ошибке кажутся мне идентичными.

Что работает, хотя просто опускает первый аргумент, например, так:

const obs = new Observable((s: Subscriber<{}>): TeardownLogic => {});

Что смущает меня, потому что теперь определенная здесь лямбда не похожа на ту, что в сигнатуре конструктора.

Я знаю об использовании «this» в конструкторе, а также о замыкании и различном значении «this» в функции со стрелкой.Но я не знаю какого-либо специального значения «this», когда оно используется в качестве аргумента в сигнатуре метода.Я погуглил и прочитал документацию по «этому» в MDN, но все еще не стал мудрее.

В конструкторе Observable «это» в «подписке»: (this: Observable, subscriber: Subscriber) => TeardownLogic 'похоже на магическое поведение.Может кто-нибудь объяснить мне, что это такое и где я могу найти документацию по этому вопросу, пожалуйста?

1 Ответ

0 голосов
/ 28 февраля 2019

В определении функции:

 (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic

Здесь this - это специальный синтаксис в Typescript.Он определяет тип "this", который ожидает функция.Так что здесь это просто означает, что он должен вызываться Observable с тем же типом T, что и подписчик.

В списке параметров он стоит первым.Это фиктивный параметр, и его следует вызывать без него.

Итак, ваш код работает:

new Observable((s: Subscriber<{}>): TeardownLogic => {});

Я думаю, что Typescript только что получил тип {} и передал его новому Observable, посколькуВы не указали тип.Так что теперь они одного типа.

Более подробную информацию можно найти Здесь :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...