NativeScript:增强tns平台声明
在我的NativeScript项目中,我想包含Android支持库中的RecyclerView
。 我列入app/App_Resources/Android/app.gradle
的依赖:NativeScript:增强tns平台声明
// Uncomment to add recyclerview-v7 dependency
dependencies {
compile 'com.android.support:recyclerview-v7:+'
}
从git issue#2295及其他相关问题,我读到tns-platform-declarations
可包括提供定义文件原生Android/IOS库。 所以我安装它们并随后tns platform declarations documentation
我想编译以下示例代码段:
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”。
我也试过声明RecyclerView类没有成功:
export declare class RecyclerView extends ContentView {}
我知道这样一个事实,即tns-platform-declarations
有定义,直到android.support.v7.widget
。
将“noEmitOnError”设置为false的解决方法感觉不对。
那么我怎样才能把这个声明扩展到android.support.v7.widget.RecyclerView
没有编译问题?
版本:
- “nativescript-DEV-打字稿”: “^ 0.3.2”
- “TNS-平台的声明”:“^ 2.4.0-2016-09-28-1 “
- ”打字稿“: ”^ 2.1.1“
- ”TNS-核心模块“: ”下一个“
最后我没跟去tns-platform-declarations
在所有的,因为表现得非常糟糕(特别是如果你有ve < =您开发机器中的8GB RAM)。
我的解决方案是定义一个自己的my-typings.d.ts
文件(例如在项目的根目录中),其中我定义了扩充类型RecyclerView
。默认值为tsconfig.json
,它应该自动被tsc
追上。否则可以添加exclude
/include
或files
表达式。
然后您可以在里面放置/// <reference path="path/to/RecyclerView/file.d.ts" />
,以便可以通过Typescript编译器找到以下ambient global namespace
。
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
声明(这是没有必要的,因为你已经全局声明的命名空间)。
对于使用extend
扩展原生Java类型的特殊情况,我为相关类定义了一个静态方法,如static extend(AdapterImpl): { new() }
,其返回类型可以用new
实例化。
希望,这有助于其他类似的问题。
我有点不喜欢这个答案 - 我希望它是正确的。如果代码完成不起作用,为什么还要导入整个本地平台? – FlavorScape
我提出了一个参考问题:http://stackoverflow.com/questions/43079773/how-to-use-the-native-android-widgets-type-definitions-in-nativescript – FlavorScape