当然,这种东西可以通过其他方式实现,但我仍然很好奇为什么TS不会发出警告。相同的结构可能有不同的数据。
turtles-on on-left = nobody
修改 可以在这里开始替代:https://basarat.gitbooks.io/typescript/docs/tips/nominalTyping.html
答案 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足够聪明,可以检测Movable
和Static
除了名称之外基本上是相同的类型。它们都是Component<boolean>
且没有属性,因此它允许您将新的Static
实例推送到Movable
数组中。只有当我向Movable
中添加了Static
中不存在的属性时,TypeScript编译器才显示错误,例如:
我想这就是TypeScript的工作原理。它不一定禁止您在泛型对象上使用不同的类型,除非给定的类型缺少预期类型上存在的属性。这就是为什么以下内容也有效: