No puedo reproducir esto en TS Playground. Tengo un método que devuelve una instancia:
class Base { static selectOne<T extends typeof Base>(this: T): InstanceType<T> {} } class Foo extends Base {} class Bar extends Base {}Esto generalmente funciona bien con VS Code IntelliSense, por ejemplo:
const foo = Foo.selectOne(); // foo is type "Foo"Sin embargo, si tengo una unión de clases, deja de funcionar:
const foo = (Foo as typeof Foo | typeof Bar).selectOne(); // foo is type "any" Este ejemplo funciona en TS Playground , muestra Foo | Bar , así que probablemente hay algo raro con mis clases. Como solución alternativa, necesitaba agregar el tipo de instancia a la clase:
class Base { static selectOne<T extends typeof Base>(this: T): T['instanceType'] {} static instanceType: Base; } class Foo extends Base { static instanceType: Foo; } class Bar extends Base { static instanceType: Bar; } ¿Cuáles son algunas de las posibles razones por las que InstanceType devuelve any ? Ya pasé varios días tratando de depurar esto. No puedo compartir un ejemplo reproducible porque hay cientos de archivos.
Base tsconfig.json:
{ "compilerOptions": { "target": "esnext", "module": "esnext", "moduleResolution": "node", "allowJs": true, "noEmit": true, "noEmitHelpers": true, "strict": true, "isolatedModules": true, "esModuleInterop": true, "skipLibCheck": true, "baseUrl": "./", "noImplicitAny": true, "noImplicitOverride": true, "strictNullChecks": true, "useUnknownInCatchVariables": true, "resolveJsonModule": false, "types": ["node"], "experimentalDecorators": true, "noErrorTruncation": true, }, "exclude": [ "./node_modules", "./build", ], }