хотел бы прокомментировать это, но оно становится длинным ....
у вас есть пара фундаментальных недоразумений машинописи и того, как она работает в отношении javascript и js распространения пакетов в целом .
first .. .d.ts
Файлы расширения являются только файлами объявлений типов для удобства использования машинописного текста. у них нет реального выполняемого кода, они просто сообщают транспортеру, какие функции и переменные типа и т. д. c ... они (необязательно) генерируются транспилером, когда вы связываете свой код для распространения, или иногда поддерживаются отдельно для библиотеки, которые изначально не являются TS для совместимости с TS. Вы можете поместить файл my-function.d.ts
в ваше приложение root прямо сейчас со следующим:
declare function myFunction(a: string): string;
, и машинопись с радостью примет ваше слово, что myFunction
существует, и позволит вам запустить его в любом месте вашего спроектировать и сообщить вам типизацию для него, даже если вы на самом деле не реализовали его, и это приведет к ошибкам во время выполнения. Потому что иногда библиотеки js загружаются таким образом, о котором машинопись не может знать, и вот как вы говорите, что они есть. Это также то, как вы говорите это для набранных ранее пакетов, которые вы получили из npm, которые теперь находятся в JS. Подробнее о файлах объявлений: https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html
ядро package.json
in angular указывает на фактический файл js, который содержит реальный переданный исходный код, который веб-пакет будет захватывать и используйте в своем комплекте, но он едва читаем, так как генерирует код из машинописного текста и веб-пакета. материал, который вы получаете из npm, не является исходным кодом, на который вы должны обратить внимание, чтобы выяснить внутреннюю работу angular, так как npm, как правило, поставляет связанные пакеты для эффективности вместе с файлами объявлений типов для удобства пользователей машинописного текста. , чтобы найти нетранслируемый / связанный источник машинописного текста, вы должны посетить angular github (https://github.com/angular/angular). все это с открытым исходным кодом, и вы можете клонировать репо и исследовать сколько угодно, но вы пытаетесь сделать javascript эквивалент чтения двоичных файлов или пакетов из nuget прямо сейчас.
секунда ... когда он говорит, что типом возврата является PlatformRef
, который является абстрактным классом, это не означает, что он возвращает экземпляр PlatformRef
, это означает, что он возвращает экземпляр класса, который расширяет или реализует PlatformRef
. Это может быть любое количество различных конкретных реализаций PlatformRef
. Это полезно, поскольку позволяет разработчикам иметь разные ссылки на платформы для разных платформ, например, браузер или мобильное приложение, поэтому привязки данных и событий можно абстрагировать и заменить на самом низком уровне. Это делает код angular чрезвычайно переносимым. Это также означает, что большинству angular разработчиков не нужно беспокоиться о конкретной реализации PlatformRef
, пока они кодируют свое приложение. Им просто нужно знать, как использовать инструменты, предоставляемые angular, для создания переносимого приложения, поскольку все это было хорошо отведено, чтобы позволить разработчикам приложений сосредоточиться на приложении, а не на особенностях браузеров и мобильных платформ.
Я повторю свою точку зрения из моих комментариев здесь, PlatformRef
просто определяет контекст приложения, чтобы angular мог правильно связывать события и данные. Он должен знать, работает ли он в браузере или мобильном контексте, чтобы он мог зацепиться за нажатие кнопок, прокрутку или жесты или что угодно, используя правильные методы для контекста, обеспечивая при этом согласованный API для разработчика. Это просто абстракция, поэтому вы, как разработчик, всегда можете связать событие click с <button (click)="myFunction()">
, не беспокоясь о контексте приложения. Лично я почти полностью разбирался в источнике angular почти за десять лет работы с ним, и эта информация была мне полезна, может быть, несколько раз в очень далеком сценарии ios. Angular Источник действительно большой и сложный, так как он делает много всего. Это не очень хорошая отправная точка для angular, есть бесчисленные руководства и руководства по разработке, а затем, если вам все еще интересно, перейдите к исходному тексту.
Вам нужно было бы узнать об этом больше, если, скажем, вы надеялись, что ваше приложение будет работать как интеллектуальный телевизор / холодильник / тостер / что угодно. Тогда вам очень нужно написать собственную конкретную реализацию PlatformRef
и написать фабричную функцию для ее доставки.