【问题标题】:Typescript: Function parameter in Class Method has narrower parameter than in the parent class打字稿:类方法中的函数参数比父类中的参数更窄
【发布时间】:2020-04-06 16:46:33
【问题描述】:

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

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方法中,typescript显示错误:

TS2345:'(namedObject: NamedObject) => boolean' 类型的参数不可分配给'(o: object) => boolean' 类型的参数。
参数“namedObject”和“o”的类型不兼容。
“{}”类型中缺少属性“名称”,但在“NamedObject”类型中是必需的。

现在,我知道 NamedObjectManager 只会管理 NamedObjects。假设像 addObject 这样的函数确保只有 NamedObjects 会出现在这里。那么,我怎样才能告诉 typescript 所有由 NamedObjectManager 管理的对象都是 NamedObjects,并且我们可以在从父级继承的方法中安全地假设这一点?

【问题讨论】:

    标签: typescript class inheritance callback


    【解决方案1】:

    您可以使用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;
    

    【讨论】:

    猜你喜欢
    • 2019-03-20
    • 2020-12-28
    • 2019-07-05
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多