在我的NativeScript项目中,我想包含RecyclerViewAndroid支持库中的内容。我将依赖项包括在app/App_Resources/Android/app.gradle:
app/App_Resources/Android/app.gradle
// Uncomment to add recyclerview-v7 dependency dependencies { compile 'com.android.support:recyclerview-v7:+' }
从git issue#2295和其他相关问题中,我读到tns-platform-declarations可以提供本机android / ios库的定义文件的内容。所以我安装了它们并遵循了tns平台声明文档
我想编译以下示例代码段:
import { ContentView } from "ui/content-view"; declare var android: any; export class OptimizedListView extends ContentView { private _android: android.support.v7.widget.RecyclerView; public _createUI() { this._android = new android.support.v7.widget.RecyclerView(this._context); } };
声明var android以上类似内容可清理的第二个参考RecyclerView。但是,仍然存在以下有关RecyclerView的顶级参考错误:
消息:“名称空间'android.support.v7.widget'没有导出的成员’RecyclerView’。”
'android.support.v7.widget'
我也尝试声明RecyclerView类没有成功:
export declare class RecyclerView extends ContentView {}
我知道事实,tns-platform-declarations直到为止都有定义android.support.v7.widget。
tns-platform-declarations
android.support.v7.widget
将“ noEmitOnError”设置为false的解决方法感觉不正确。
“ noEmitOnError”
那么,如何在android.support.v7.widget.RecyclerView没有编译问题的情况下将此声明扩展到?
android.support.v7.widget.RecyclerView
版本:
“ nativescript-dev-typescript”:“ ^ 0.3.2” “ tns平台声明”:“ ^ 2.4.0-2016-09-28-1” “ typescript”:“ ^ 2.1.1” “ tns-core-modules”:“下一个”
最终,我根本不赞成tns-platform-declarations,因为性能非常糟糕(特别是如果您的开发机中的RAM小于等于8GB)。
我的解决方案是定义一个自己的my-typings.d.ts文件(例如,在项目根目录中),在其中定义扩展类型RecyclerView。随着tsconfig.json违约应该自动被追上了tsc。否则可以添加exclude/include或files表达式。
my-typings.d.ts
RecyclerView
exclude/include
然后,您可以放置一个/// <reference path="path/to/RecyclerView/file.d.ts" />内部,以便ambient global namespaceTypescript编译器可以找到以下内容。
/// <reference path="path/to/RecyclerView/file.d.ts" />内部,以便ambient global namespaceTypescript
declare namespace android { namespace view { namespace ViewGroup { namespace LayoutParams { const MATCH_PARENT; const WRAP_CONTENT; } } class ViewGroup { } } namespace support.v7.widget { namespace RecyclerView { type AdapterImpl = { onCreateViewHolder(parent: android.view.ViewGroup, viewType: number): ViewHolder; onBindViewHolder(holder: android.support.v7.widget.RecyclerView.ViewHolder, position: number): void; getItemCount(): number }; class Adapter { static extend(AdapterImpl): { new () } } class LayoutParams { constructor(width: any, height: any); } class ViewHolder { static extend: any; } } class RecyclerView { constructor(context: any); setAdapter(Adapter): void; setLayoutManager(LinearLayoutManager): void; } class LinearLayoutManager { constructor(context: any); } } }
基本上,名称空间可用于模拟嵌套的对象属性(例如android.view.xxx)。如果内部类是用Java定义的(Typescript似乎禁止嵌套class语句),这也是这种方式。
在实际使用类型的情况下,我还必须定义一个与名称空间同名的类android.view.ViewGroup。否则你会得到错误
没有出口会员xxx
,即使使用显式声明了类类型export(也没有必要,因为已经全局声明了名称空间)。
对于使用扩展本机Java类型的特殊情况extend,我为相关类定义了一个静态方法,例如static extend(AdapterImpl): { new () },其返回类型可以使用实例化new。
static extend(AdapterImpl): { new () }
希望对其他类似问题有所帮助。