Angular typescript包可见性(创建库)
我正在创建一个用于不同项目的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(){
/* 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或内部方法。@user1439356getName
函数获取上下文this
。您可以访问内部方法