tns-platform-declarations
为 NativeScript 访问原生对象而提供的平台特定的 TypeScript 声明
npm i --save tns-platform-declarations

此插件包含 NativeScript 框架公开的原生平台类型信息。

官方支持的入口点

  • android.d.ts - 用于 Android SDK 和运行时类型。
  • ios.d.ts - 用于 iOS SDK 和运行时类型。

使用声明可能与 DOM 类型声明冲突,请考虑使用 TypeScript 2.x.x 和以下 tsconfig.json 中的设置

{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"experimentalDecorators": true,
"lib": [
"es6",
"dom"
]
}
}

创建 reference.d.ts 并添加以下内容

/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/android.d.ts" />

默认情况下,android.d.ts 文件包含 Android API 级别 17 的类型声明。如果您的应用程序具有更高的最低 API 级别,则可以使用该级别

/// <reference path="./node_modules/tns-platform-declarations/android-24.d.ts" />

d.ts 文件需要大量的内存和 CPU。考虑在 tsconfig 文件中添加 skipLibCheck 选项。

生成 Android .d.ts 文件

  • 要生成 Android 依赖项,请使用具有相应 Android 版本和 androidx jar 的 android-dts-generator
  • 要重新生成 android-*.d.ts 文件,请使用 android-dts-generator 并传递相应的 android jar(详细信息请参阅 此处

生成新的 Android 平台类型声明

最简单的方法是使用 Makefile,该文件位于 android-dts-generator 仓库中。

打开 makefile 并检查它是否已经包含您要为生成类型声明的 Android 平台版本的命令条目。如果不存在,请添加它。例如,对于 API 级别 29,您需要添加以下内容

android-platform-29:
java -jar dts-generator/build/libs/dts-generator.jar -input ${ANDROID_HOME}/platforms/android-29/android.jar
mv out/android.d.ts out/android-platform-29.d.ts

同样,在 makefile 中更新 android-platform-all 命令如下

android-platform-all: android-platform-17 android-platform-18 android-platform-19 android-platform-20 android-platform-21 \
android-platform-22 android-platform-23 android-platform-24 android-platform-25 android-platform-26 android-platform-27 \
android-platform-28 android-platform-29

现在从命令行执行以下操作

make android-platform-29

out/android-platform-29.d.ts 的输出复制到本仓库中的 tns-platform-declarations/android 文件夹。再次在 NativeScript 仓库中,通过复制和更新现有的 d.ts 在 tns-platform-declarations 文件夹中创建一个新的平台 d.ts 文件。例如,我们正在为 API 级别 29 生成类型声明,请复制 tns-platform-declarations/android-28.d.ts,将其重命名为 tns-platform-declarations/android-29.d.ts 并更新其文件内容如下

/// <reference path="./android/android-platform-29.d.ts" />
/// <reference path="./android/androidx-28.d.ts" />
/// <reference path="./android/common.d.ts" />

注意,在此阶段我们没有更新上面的 androidx 引用。为了避免为每个不同的 API 级别提供 androidx 类型声明,我们尝试使用与较旧 API 级别构建的 androidx 类型声明来重用一系列 Android 版本的 androidx 类型声明(例如,androidx 26 的类型声明可用于 API 级别 26 和 27)。现在我们需要检查新的平台类型声明是否可以使用现有的 androidx d.ts,或者我们需要生成新的类型声明。

在主 NativeScript 仓库中的 tns-platform-declarations 文件夹中执行以下操作

# not mandatory, just to verify that the existing setup was ok (should complete without errors)
tsc android-28.d.ts

# this is the actual check for the new platform typings
tsc android-29.d.ts

如果 tsc 命令完成而没有任何错误,那么您就可以继续;否则,您需要使用具有相同 Android API 级别的 super jar 生成 androidx 类型声明(更多详细信息请参阅 此处,但您也可以直接按照下面的部分进行操作)。

为新的平台版本生成 Androidx 类型声明

您可以在这里找到Androidx 1.0.0的jar文件,但我们将演示如何从头开始提取jar文件,这对于更新Androidx版本将非常有用。由于Androidx需要基础的android.jar文件来创建其typings,您需要将android.jar文件作为super参数传递给生成器。

android-dts-generator仓库中打开makefile,并按照以下步骤进行(因为我们正在为Android API级别29生成typings)

androidx-29:
java -jar dts-generator/build/libs/dts-generator.jar \
-input dts-generator/jar-files/ -input-generics libs/generics.txt \
-super ${ANDROID_HOME}/platforms/android-29/android.jar -skip-declarations
mv out/android.d.ts out/androidx-29.d.ts

再次在makefile中更新androidx-all命令如下

androidx-all: androidx-17 androidx-23 androidx-26 androidx-28 androidx-29

现在我们需要在dts-generator/jar-files文件夹中提取所有Androidx的jar文件(遵循https://github.com/NativeScript/android-dts-generator#finding-package-dependencies。注意,必要的Androidx依赖在dts-generator/build.gradle文件中被注释掉,您只需要临时取消注释它们

// ...

dependencies {
implementation 'org.apache.bcel:bcel:6.2'
implementation 'commons-io:commons-io:2.6'
implementation 'com.google.code.findbugs:findbugs:3.0.1'

// add your dependency here as the example bellow, make sure you are using testCompileOnly
//AndroidX
//testCompileOnly "androidx.legacy:legacy-support-v4:1.0.0" <------ uncomment but do not commit
//testCompileOnly "androidx.appcompat:appcompat:1.0.0" <------ uncomment but do not commit
//testCompileOnly "com.google.android.material:material:1.0.0" <------ uncomment but do not commit
}

// ...

dts-generator文件夹中,在命令行中执行以下操作(这将获取dts-generator/jar-files文件夹中所需的jar文件)

./gradlew extractAllJars

现在从命令行执行以下操作

make android-platform-29

out/androidx-29.d.ts的输出复制到主NativeScript仓库中的tns-platform-declarations/android文件夹。再次在主NativeScript仓库中更新tns-platform-declarations/android-29.d.ts的内容如下

/// <reference path="./android/android-platform-29.d.ts" />
/// <reference path="./android/androidx-29.d.ts" />
/// <reference path="./android/common.d.ts" />

在主 NativeScript 仓库中的 tns-platform-declarations 文件夹中执行以下操作

# should complete without errors now
tsc android-29.d.ts

生成ios .d.ts文件

使用iOS运行时的metadata生成器生成iOS的.d.ts文件。您可以像这样使用typings-gen.sh脚本

./typings-gen.sh rc [<path-to-medatadata-generator-binary>]

其中rc可以是用于生成typings的tns-ios的NPM标签/版本。如果要使用的metadata生成器尚未在NPM中发布,您可以可选地指定其路径作为第二个参数。

注意:由于TypeScript错误,请应用提交

该脚本明确删除了分配tns-core-modules包的objc!MaterialComponents.d.ts文件,以避免插件冲突。

但是,iOS的metadata生成器包括整个SDK以及所有使用的本地库的元数据和typings,包括MaterialComponents。因此,有些typings引用了objc!MaterialComponents.d.ts文件并无法在转换时成功。

目前,手动删除这些文件以避免转换错误。一个建议的解决方案是指定要生成的元数据条目,并使其从JavaScript中可访问。这些是AndroidiOS的功能请求