2017-06-29 51 views
0

我正在創建打印稿庫以用於不同的項目。 我想要的只是爲外部發布我的類功能的一個子集,並在我的庫中內部使用其他子集。打字稿包的可見性(創建庫)

在這個例子中:

/* Person.ts */ 
export class Person{ 
    getName(){ 
     ..... 
     return name; 
    } 
    getInfos(){ 

    } 
} 

/* People.ts */ 
export class People{ 
    ... 
    setName(){ 
     let p = new Person(); 
     ... 
     let n = p.getName(); 
     .... 
    } 

} 

我想,我的圖書館暴露人getInfos()和人民的setName(),但我希望那個人的getName只能訪問內部。 也許我必須創建一個Person.d.ts,只向外部用戶提供一種方法,但我不明白。

謝謝

+0

注意'People'類將訪問_getName()_方法,所以設置因爲'私人'不是解決方案。在你的例子中, – user1439356

回答

1

你必須區分編譯時和運行時封裝。如果您只需要編譯時封裝,則可以使用@trichetriche建議的方法,並聲明getName爲私有的或使用@yurzui的更高級方法。

如果你想運行時封裝,你必須使用不同的方法。如果你導出一個類,它會將所有的方法導出爲JavaScript,所有東西都是公開的。要隱藏某些功能,您可以在模塊中創建功能getName,但不要公開它。你將能夠使用它,但它不會提供外:如果你想在內部使用的getName和不出口了,根本就

/* Person.ts */ 
export class Person{ 
    protected getName(){ 
     return getName(); 
    } 
    getInfos(){ 

    } 
} 

/* People.ts */ 
export class People extends Person { 
    ... 
    setName(){ 
     let p = new Person(); 
     ... 
     let n = p.getName(); 
     .... 
    } 

} 
+0

,函數getName與Person類是獨立的,所以不能訪問私有變量或內部方法。 – user1439356

+0

@ user1439356'getName'函數獲取上下文'this'。你可以訪問內部方法 – yurzui

0

d.ts文件沒有具體的方法,你可以做以下

parson.ts

export class Person{ 
    /** @internal */ <== annotate field with internal flag 
    private getName(){ 
    return name; 
    } 
    /** @internal */ <== annotate field with internal flag 
    public getName2(){ 
    return name; 
    } 
    getInfos(){ 

    } 
} 

然後告訴編譯器不發射的聲明通過指定stripInternal編譯選項

tsconfig.json

{ 
    "compilerOptions": { 
    ... 
    "declaration": true, 
    "stripInternal": true, <== this option 

具有/** @internal */ JSDoc註釋代碼的輸出應該如下

person.d.ts

export declare class Person { 
    getInfos(): void; 
} 

所以打字稿跳過所有領域標註有/** @internal */甚至public變質

角使用相同的方法時,正在建設的項目

+0

這仍然可以在JS中訪問,儘管 –

+0

這是一個問題嗎? – trichetriche

+0

它取決於OP想要什麼,運行時封裝或編譯時間 –

1

如果你想有

function getName() {... return name;} 

export class Person{ 
    getInfos(){ 
     return getName.call(this); 
    } 
} 
+0

但是'People'類可以訪問getName方法? – user1439356

+0

正如@Maximus所說的'在JavaScript中一切都是公開的'。所以'const people = new People(); (任何人).getName()'應該工作。我的解決方案適合編譯時間 – yurzui

+0

我知道在js中都是公開的,我有興趣在編譯時進行封裝。 我的目標是創建一個庫,並允許其他開發人員在我的類中只使用一些方法(就像我使用Java中的_package_修飾符一樣)。 我認爲你的解決方案是不夠的 – user1439356