打字稿包可见性(创建库)

时间:2017-06-29 09:30:07

标签: angular typescript package declare

我正在创建一个要在不同项目中使用的打字稿库。 我想要的是只在外部发布我的类函数的一个子集,并在我的库中内部使用其他函数。

在示例中:

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

    }
}

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

}

我希望我的库公开Person getInfos()和People setName(),但我希望Person getName只能在内部访问。 也许我已经创建了一个Person.d.ts,只向外部用户公开一种方法,但我不明白如何。

由于

3 个答案:

答案 0 :(得分:1)

您必须区分编译时和运行时封装。如果您只需要编译时封装,则可以使用@trichetriche建议的方法并将getName声明为私有或使用@yurzui的更高级方法。

如果您想要运行时封装,则必须使用不同的方法。如果您导出一个类,它将导出其所有方法,就像在JavaScript中一切都是公共的一样。要隐藏某些功能,可以在模块中创建函数getName,但不要公开它。您将能够使用它,但它不会在外面使用:

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

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

答案 1 :(得分:1)

如果您想在没有特定方法的情况下拥有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(){

  }
}

然后告诉编译器不要通过指定/** @internal */编译选项

为具有stripInternal JSDoc注释的代码发出声明

<强> tsconfig.json

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

输出应如下

<强> person.d.ts

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

因此,即使使用/** @internal */修饰符

,打字稿也会跳过用public注释的所有字段

Angular在构建项目时使用相同的方法

答案 2 :(得分:0)

如果要在内部使用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();
      ....
    }

}