2017-06-29 69 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