Both describe "what a subclass must provide", but only one exists at runtime.
implements Interfaceis a compile-time check that the class is assignable to the interface. It adds no members, infers no parameter types (log(msg)is still an implicitany), and emits nothing: the interface and theimplementsclause are erased. A class can implement several. You cannotinstanceofan interface.abstract classis emitted as an ordinary JavaScript class.abstractmembers have no body and emit nothing. It can hold constructor logic, fields, and concrete methods that call abstract ones (the template method pattern). The checker stopsnewon it (TS2511) and requires concrete subclasses to implement every abstract member (TS2515). A class canextendsonly one base.instanceofworks with an abstract class, so it can serve as a runtime type check. A class that merelyimplementsthe same shape is not an instance.
Rule of thumb: start with an interface; reach for an abstract class when subclasses genuinely share implementation, or when the base needs to enforce an order of steps. Composition is often better than either.
Passing an abstract class as a value. Since 4.2 the type abstract new (...args) => T accepts abstract and concrete classes. A plain new () => T parameter rejects typeof Shape ("Cannot assign an abstract constructor type to a non-abstract constructor type") because the callee could new it.
implements a class treats that class as an interface, including its private members, so it fails if the class has any (TS2720). Use extends.
All of this is type-level. The emitted JavaScript has no guard, so a cast defeats it (see Pitfalls).