打字稿:类方法中的函数参数比父类中的参数更窄

Posted

技术标签:

【中文标题】打字稿:类方法中的函数参数比父类中的参数更窄【英文标题】: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,并且我们可以在从父级继承的方法中安全地假设这一点?

【问题讨论】:

【参考方案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;

【讨论】:

感谢您的回答。有没有办法只允许对象作为 T(不是字符串、数字等)? This question 似乎没有解决方案,打字稿泛型文档只解释了如何期望 T 上的特定属性。 @KWeiss 确定:AnyObjectManager&lt;T extends object&gt; 更多信息在这里typescriptlang.org/docs/handbook/basic-types.html#object

以上是关于打字稿:类方法中的函数参数比父类中的参数更窄的主要内容,如果未能解决你的问题,请参考以下文章

子父类中的构造函数

打字稿:通过传入命名参数的构造函数创建类?

在打字稿中的类中创建具有未知参数的方法

想调用父类中的有参构造函数

如何在抽象父类中为实现打字稿制作泛型方法?

Java继承-子类不可以继承父类的构造方法