如何正确地从外部库中排除抽象类型脚本类



我在我们的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';吗?

你在代码中犯了两个错误:

  1. 首先,您正在尝试使用this调用静态getter。从成员函数中引用静态属性的正确方法是this.constructor.baseUrl

  2. 其次,您在静态函数中使用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错误消息。

现在可以了

最新更新