NativeScript:增强tns平台声明

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/includefiles表达式。

然后您可以在里面放置/// <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实例化。

希望,这有助于其他类似的问题。

+0

我有点不喜欢这个答案 - 我希望它是正确的。如果代码完成不起作用,为什么还要导入整个本地平台? – FlavorScape

+0

我提出了一个参考问题:http://*.com/questions/43079773/how-to-use-the-native-android-widgets-type-definitions-in-nativescript – FlavorScape