2016-11-20 41 views
2

在我的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-核心模塊「: 」下一個「

回答

0

最後我沒跟去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://stackoverflow.com/questions/43079773/how-to-use-the-native-android-widgets-type-definitions-in-nativescript – FlavorScape