我在我们的gitlab中存储了一个外部库,其中包含以下两个文件:
export default abstract class Client{
protected someProperty: string | undefined;
protected static get baseUrl(): string {
return 'www.test.de';
}
}
和以下index.js
:
//some other exports
export {default as Client} from './src/clients/Client';
通过npm安装lib后,我尝试如下方式使用基类:
import {Client} from 'my-external-library';
public class MyClient extends Client{
public static async getIndex(){
let url = this.baseUrl + '/somepath';
}
}
当我现在在我的项目中安装lib并想要使用基类时,我得到错误消息TS2339 Property 'baseUrl'
不存在类型'MyClient'。
如何正确地导出Client基类,使我可以使用它而不会出现任何错误消息?
除了错误消息外,代码按预期工作。
除此之外,当我尝试在实例化类MyClient
后访问属性someProperty
时,我也得到错误消息:
let myClient = new MyClient();
let test = myClient.someProperty
如何访问抽象类Client
的属性?
更新在我的主要项目中有抽象类,我可以访问我的抽象类的属性,但在我的外部库中有它,这个类似乎不被识别,这样我就得到了"属性不存在例外"。通过以下代码:
let myClient = new MyClient();
let test = myClient.someProperty
是因为export { default as Client} from './src/clients/Client';
吗?
你在代码中犯了两个错误:
-
首先,您正在尝试使用
this
调用静态getter。从成员函数中引用静态属性的正确方法是this.constructor.baseUrl
。 -
其次,您在静态函数中使用
this
。从静态函数调用另一个静态函数的正确方法是使用类名。在您的情况下,它将是:MyClient.baseUrl
所以你的代码将工作与以下更改:
import { Client } from 'my-external-library';
public class MyClient extends Client {
public static async getIndex() {
let url = MyClient.baseUrl + '/somepath';
}
}
但是我觉得你并没有打算让第二个函数是静态的。所以如果你想让它成为一个成员函数,你可以这样重写:
import { Client } from 'my-external-library';
public class MyClient extends Client {
public async getIndex() {
let url = this.constructor.baseUrl + '/somepath';
}
}
对于你问题的第二部分:
如果你想访问的属性是一个常规属性,你可以完全按照你所描述的去做:
// someProperty is a member property
let myClient = new MyClient();
let test = myClient.someProperty
但是如果你想访问的属性是一个静态属性,它只能通过类来访问,而不能通过类的实例来访问。
// someProperty is a static property
let test = MyClient.someProperty;
在我上面描述的例子中,baseUrl属性是一个静态属性。
我想这篇文章会对你有帮助,它解释了静态属性和常规属性的区别:
https://khalilstemmler.com/blogs/typescript/static-members/
正如评论中所说,我犯了几个错误。由于静态方法,我删除了继承。不需要继承。
我通过添加.tsconfig
来生成声明文件(d.ts
) Link来解决property 'xy' does not exist on type
错误消息。
现在可以了