我正在创建一个要在不同项目中使用的打字稿库。 我想要的是只在外部发布我的类函数的一个子集,并在我的库中内部使用其他函数。
在示例中:
/* 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,只向外部用户公开一种方法,但我不明白如何。
由于
答案 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();
....
}
}