Typescript:类方法中的函数参数比父类中的函数参数更窄

问题描述 投票:0回答:1

我有两个打字稿课。一个扩展了另一个:

type NamedObject = {
    name: string;
}

class AnyObjectManager {
    objectList = [];
    getAnyObject = (matches: (o: object) => boolean) => {
        for (const o of this.objectList) {
            if (matches(o)) {
                return o;
            }
        }
        return null;
    }
}

class NamedObjectManager extends AnyObjectManager {
    getObjectNamedTim = () => {
        return this.getAnyObject(this.objectIsNamedTim)
    }
    objectIsNamedTim = (namedObject: NamedObject) => {
        return namedObject.name === 'Tim';
    }
}

在方法NamedObjectManager.getObjectNamedTim中,打字稿显示错误:

TS2345:类型'(namedObject:NamedObject)=>布尔值的参数不能分配给类型'(o:object)=>布尔值'的参数。参数“ namedObject”和“ o”的类型不兼容。类型“ {}”中缺少属性“名称”,但类型“ NamedObject”中则为必需。

现在,我知道NamedObjectManager将仅管理NamedObjects。假设像addObject这样的函数确保只有NamedObjects在这里。因此,如何告诉打字稿,由NamedObjectManager管理的所有对象都将是NamedObjects,并且我们可以在从父级继承的方法中安全地假定这一点?

typescript class inheritance callback
1个回答
0
投票

您可以使用generics并以“类型安全”的方式管理对象:

class AnyObjectManager<T> {
    objectList: T[] = [];
    getAnyObject = (matches: (o: T) => boolean) => {
        for (const o of this.objectList) {
            if (matches(o)) {
                return o;
            }
        }
        return null;
    }
}

class NamedObjectManager extends AnyObjectManager<NamedObject> {
    getObjectNamedTim = () => {
        return this.getAnyObject(this.objectIsNamedTim)
    }
    objectIsNamedTim = (namedObject: NamedObject) => {
        return namedObject.name === 'Tim';
    }
}

Playground


无关,getAnyObject可以简化为:

getAnyObject = (matches: (o: T) => boolean) => this.objectList.find(matches) || null;
© www.soinside.com 2019 - 2024. All rights reserved.