Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular typescript包可见性(创建库)_Angular_Typescript_Package_Declare - Fatal编程技术网

Angular typescript包可见性(创建库)

Angular typescript包可见性(创建库),angular,typescript,package,declare,Angular,Typescript,Package,Declare,我正在创建一个用于不同项目的typescript库。 我想要的是只为外部发布类函数的一个子集,并在库中内部使用其他函数 在示例中: /* Person.ts */ export class Person{ getName(){ ..... return name; } getInfos(){ } } /* People.ts */ export class People{ ... setName(){

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

在示例中:

/* 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()和Person setName(),但我希望Person getName只能在内部访问。 也许我必须创建一个Person.d.ts,它只向外部用户公开一个方法,但我不知道如何创建


谢谢

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

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

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

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

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

}

如果希望库中包含
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(){

  }
}
export declare class Person {
  getInfos(): void;
}
输出应如下所示

个人d.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(){

  }
}
export declare class Person {
  getInfos(): void;
}
因此,typescript跳过了使用
/**@internal*/
注释的所有字段,即使使用
public
修改器也是如此


Angular在构建项目时使用相同的方法这在JS中仍然可以访问,但这是一个问题吗?这取决于OP想要什么、运行时封装或编译时间如果该方法是私有的,
人员
类不能使用它。我需要一种“包”方法,使我的库中的所有类都可以使用它,但外部项目只使用公共方法。@trichetriche,这不会有帮助,因为所有类都必须扩展基类才能使用
受保护的
。但是
类可以访问getName方法?正如@Maximus在JavaScript中所说的
,一切都是公开的
。所以
const people=新人();(与任何人一样)。getName()
应该可以工作。我的解决方案适用于编译时,我知道js中的所有内容都是公开的,我对编译时的封装感兴趣。我的目标是创建一个库,并允许其他开发人员只使用我的类中的一些方法(就像我在Java中使用package modifier一样)。我认为你的解决方案不是enough@Maximus对不起,我是说getName2。。我尝试您的代码:-如果我使用内部注释,我有一个ts错误(找不到名称“internal”)。我必须进口一些东西吗如果我从该模块外部手动创建Person.d.ts文件,ts也允许我使用Person.getName2()。在我的测试中,Person.d.ts和Person.ts在同一个文件夹中。我不知道您是如何构建库的。我坚持Angular Package Format v4.0,注意
People
class将访问getName()方法,因此将其设置为
private
不是解决方案。在您的示例中,函数getName独立于Person类,因此无法访问私有var或内部方法。@user1439356
getName
函数获取上下文
this
。您可以访问内部方法