首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么私有属性是接口的一部分?

为什么私有属性是接口的一部分?
EN

Stack Overflow用户
提问于 2019-10-09 18:22:02
回答 2查看 158关注 0票数 2

请考虑以下几点:

代码语言:javascript
复制
class X  {
    bar() {
        return "bar"
    }
    constructor(private readonly x: number){}
}

interface Y extends X {
}


const f = (y: Y) => { console.log(y.bar()); }

f({ bar: () => "tavern"});

它不编译,因为缺少x

代码语言:javascript
复制
f({ bar: () => "tavern", x: 1});

不编译,因为x不是私有的。

重写代码,这样就可以声明x私有

代码语言:javascript
复制
class Y implements X {
    bar() {
        return "tavern"
    }
    private x = 1;
}

因为“类型有单独的声明”而被拒绝。

我找到的唯一解决方案是从构造函数中删除private

我真正想做的是第一件事:我不关心类的私有属性,尤其不关心构造函数中声明的私有成员。

我的两个问题是:

  1. 为什么是这种情况?
  2. 如果有的话,我能做什么呢?我不需要担心私人财产?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-09 19:14:43

Ryan,微软打字组的开发负责人,

允许私有字段丢失将是一个巨大的问题,而不是一些琐碎的可靠问题。 请考虑以下代码: 类标识{私有id: string =“秘密代理”;公共sameAs(其他:标识){返回this.id.toLowerCase() === other.id.toLowerCase();}类MockIdentity实现标识{公共sameAs(其他:标识){返回false;}} MockIdentity是一个与公共兼容的Identity版本,但是当一个非模拟的副本与一个模拟的副本交互时,试图将它作为一个公共版本在sameAs中崩溃。

这太糟糕了。这很有道理,但很糟糕。

但是我找到了一个解决我问题的方法:

代码语言:javascript
复制
type Public<T> = {
    [P in keyof T]: T[P];
};

class X  {
    bar() {
        return "bar"
    }
    constructor(private readonly x: number){}
}

interface Y extends Public<X> { }

const f = (y: Y) => { console.log(y.bar()); }

f({ bar: () => "tavern"});

这允许我可靠地模拟复杂类型,而不必模拟私有数据。

这在测试上下文中是安全的,在测试上下文中,模拟实例和实际实例从不交互。

票数 3
EN

Stack Overflow用户

发布于 2019-10-09 18:31:23

接口不应该扩展类。接口定义对象的特征(接口可饮用),类定义对象是什么(类水)。因此,我建议您定义一个接口,并让您的类实现该接口。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58310111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档