Closed
Description
π Search Terms
abstract constructor prototype type any
π Version & Regression Information
Latest version as of today.
β― Playground Link
π» Code
class A {}
type AConstructor = new() => A;
type AConstructorIntersection = (new() => A) & { prototype: A };
interface AConstructorRemedied {
new(): A;
prototype: A;
}
type AAbstractConstructor = abstract new() => A;
interface AImpossibleConstructor {
abstract new(): A; // error
prototype: A;
}
type _1 = (typeof A)['prototype']; // correct: A
type _2 = AConstructor['prototype']; // incorrect: any
type _3 = AConstructorIntersection['prototype']; // incorrect: any
type _4 = AConstructorRemedied['prototype']; // correct: A
type _5 = AAbstractConstructor['prototype']; // incorrect: any
π Actual behavior
There's no way of making the type of prototype
something other than any
, not even with an intersection.
π Expected behavior
A way to make the type of prototype
something other than any
. It seems that constructor types have a hidden prototype
of type any
. Shouldn't it be of type unknown
so that at least the intersection works? (or wouldn't it be better for it to be the same type as InstanceType
directly?)
Additional information about the issue
No response
Activity
fatcerberus commentedon Dec 15, 2023
Possible (ugly) workaround:
Omit<new () => A, "prototype"> & { prototype: A }
jcalz commentedon Dec 15, 2023
(@fatcerberus
Omit
loses the construct signature)Instead of trying to use
abstract new
inside an object type, you can do this:This will have the
prototype
property you care about while maintaining theabstract
ness of the constructorPlayground link
miguel-leon commentedon Dec 15, 2023
Thanks for the workaround @jcalz, silly me I didn't think of this while coming up with a minimal reproduction.
The thing is, the type that returns the construct signature is a parametric type.
I just tried
playground
But the interface declaration errors.
Do you think that as a parametric type then it becomes unavoidable? π
Or maybe is there another workaround?
Thanks anyway for the suggestion.
miguel-leon commentedon Dec 16, 2023
I messed around with it for a bit and managed to make it work like this:
playground
The fact that the "hidden" prototype is of type
any
instead of (at least)unknown
, it's a little bit odd, but since there's a work around, I'll close this issue.