打字稿:有没有办法区分具有相同结构的类?

时间:2018-04-07 16:48:09

标签: class typescript properties collision

当然,这种东西可以通过其他方式实现,但我仍然很好奇为什么TS不会发出警告。相同的结构可能有不同的数据。

turtles-on on-left = nobody

修改 可以在这里开始替代:https://basarat.gitbooks.io/typescript/docs/tips/nominalTyping.html

2 个答案:

答案 0 :(得分:2)

类型不要假定值应该是指定类的实例。 Movable类在此处用作接口:

const ctx: Context<Movable> = new Context()

如果值应该是Movable类的实例,则此检查通常在运行时使用if (value instanceof Movable)执行。在Array子类中实现会很棘手,Context可能更好地实现自己的API,允许验证值而不是扩展Array

  

相同的结构可能有不同的数据

但他们没有不同的数据。 Static符合Movable 接口,因此不会导致类型错误。同样,这将起作用,因为该对象符合此接口:

ctx[0].push({ value: true })

如果不是,将导致TypeScript类型错误:

ctx[0].push({ value: 1 })

通过带有合并接口的类型检查,可以额外地将值强制为Movable的实例:

interface Movable {
    constructor: typeof Movable
}
class Movable extends Component<boolean> {
  constructor(value: boolean = true) { super(value) }
}

仍然可以通过以下方式欺骗打字系统:

ctx[0].push({ constructor: Movable, value: 1 });

答案 1 :(得分:1)

TypeScript Playground中使用您的代码后,似乎TypeScript足够聪明,可以检测MovableStatic除了名称之外基本上是相同的类型。它们都是Component<boolean>且没有属性,因此它允许您将新的Static实例推送到Movable数组中。只有当我向Movable中添加了Static中不存在的属性时,TypeScript编译器才显示错误,例如:

我想这就是TypeScript的工作原理。它不一定禁止您在泛型对象上使用不同的类型,除非给定的类型缺少预期类型上存在的属性。这就是为什么以下内容也有效: