我有一个类MyClass,它使用另一个类MainProvider.问题是普通的MainProviderclass不能像我想要的那样工作,所以我创建了另一个类MyProvider,它具有相同的功能(实现与Provider相同的接口).

我的问题是,我不能在我的类(MyClass)中使用MyProvider,因为即使类MyProvider实现相同的接口,也存在与属性(此处为getFetchUrl)不匹配的情况.

它是MainProvider类中的私有属性,因此它不在接口中.但是,我不能在我的类中使用MyProvider.我收到以下错误:

我怎样才能用一个来代替另一个?

例子:

declare abstract class ProviderInterface {
    abstract baseUrl: string;
    abstract foo(): void;
}

class MainProvider implements ProviderInterface {
    baseUrl: string;
    private getFetchUrl: string;

    constructor(baseUrl: string) {
        this.baseUrl = baseUrl;
    }

    foo() {
        return "hello";
    }

}

class MyProvider implements ProviderInterface {
    private _baseUrl: string;
    private getFetchUrl: string;

    constructor(baseUrl: string) {
        this._baseUrl = baseUrl;
    }

    foo() {
        return "hey";
    }

    get baseUrl() {
        return this._baseUrl;
    }
}

class MyClassUsingProvider {
    private _provider: MainProvider;
    constructor(provider: MainProvider) {
        this._provider = provider;
    }
}

const myProvider = new MyProvider("http://127.0.0.1:3000");
const myClass = new MyClassUsingProvider(myProvider);

推荐答案

因此,问题来自这样一个事实,即一个类的私有成员对同一个类的其他实例可见,尽管在try 将一个类替换为另一个类时需要私有成员.

因此,您要做的是将类型更改为PublicParts类型,其中PublicParts表示只需要publics属性,而T是您希望公共属性来自的类型.

这修复了上述示例以及我的代码:

type PublicPart<T> = {[K in keyof T]: T[K]}

declare abstract class ProviderInterface {
    abstract baseUrl: string;
    abstract foo(): void;
}

class MainProvider implements ProviderInterface {
    baseUrl: string;
    private getFetchUrl: string;

    constructor(baseUrl: string) {
        this.baseUrl = baseUrl;
    }

    foo() {
        return "hello";
    }

}

class MyProvider implements ProviderInterface {
    private _baseUrl: string;
    private getFetchUrl: string;

    constructor(baseUrl: string) {
        this._baseUrl = baseUrl;
    }

    foo() {
        return "hey";
    }

    get baseUrl() {
        return this._baseUrl;
    }
}

class MyClassUsingProvider {
    private _provider: PublicPart<MainProvider>;
    constructor(provider: PublicPart<MainProvider>) {
        this._provider = provider;
    }
}

const myProvider = new MyProvider("http://127.0.0.1:3000");
const myClass = new MyClassUsingProvider(myProvider);

Typescript相关问答推荐

与Prettify助手类型中的对象相交?

Angular 垫页分类和垫排序不起作用

为什么在TypScript中将类型守护的返回类型写成This is(

将对象属性路径描述为字符串数组的类型

如何将绑定到实例的类方法复制到类型脚本中的普通对象?

TypScript在对象上强制执行值类型时推断对象文字类型?

根据另一个成员推断类成员的类型

使某些(嵌套)属性成为可选属性

状态更新后未触发特定元素的Reaction CSS转换

使用动态输出类型和泛型可重用接口提取对象属性

对象类型的TypeScrip隐式索引签名

是否可以强制静态方法将同一类型的对象返回其自己的类?

错误TS7030:并非所有代码路径都返回值.";由tsfig.json中的";Strong";:False引起

如何通过转换器类继承使用多态将对象从一种类型转换为另一种类型

VUE 3类型';字符串';不可分配给类型';参考<;字符串&>

更漂亮的格式数组<;T>;到T[]

如何在TypeScript中将元组与泛型一起使用?

Next 13 + React 18 createContext 类型的构建问题

Typescript 和 Rust 中跨平台的位移数字不一致

如何在由函数参数推断的记录类型中具有多个对象字段类型