I have a type AddEmailToMailingList declared as so
// addEmailToMailingList.ts
type SuccessResponse =
| {
success: false;
message: string;
code: number;
}
| {
success: true;
};
export type AddEmailToMailingList = (data: {
email: string;
}) => Promise<SuccessResponse>;
this is imported and re-exported via some generics by another file
// types.ts
import { AddEmailToMailingList } from "./functions/addEmailToMailingList";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type DuckFunction = (...args: any) => any;
type ThenArgRecursive<T> = T extends PromiseLike<infer U>
? ThenArgRecursive<U>
type HttpsCallable<T extends DuckFunction> = (
...args: Parameters<T>
) => Promise<{
readonly data: ThenArgRecursive<ReturnType<T>>;
}>;
export type CallableAddEmailToMailingList = HttpsCallable<AddEmailToMailingList>;
When I import this CallableAddEmailToMailingList type in another package in my workspace it inferes the type correctly.
This is the correct type inference:
// VSCode type inference
(alias) type CallableAddEmailToMailingList = (data: {
email: string;
}) => Promise<{
readonly data: SuccessResponse;
}>
Now I want to move the type SuccessResponse into its own file so other functions can import and use it.
// addEmailToMailingList.ts
import { SuccessResponse } from "@/typesInternal";
export type AddEmailToMailingList = (data: {
email: string;
}) => Promise<SuccessResponse>;
Now the package where I import the CallableAddEmailToMailingList type no longer has the correct type inference, it has completely lost what SuccessResponse is and it turns to any
This is what the type inference now is after importing CallableAddEmailToMailingList:
// VSCode type inference
(alias) type CallableAddEmailToMailingList = (data: {
email: string;
}) => Promise<{
readonly data: any;
}>
However it is still correct when hovering over CallableAddEmailToMailingList in the types.ts file where it is declared.
I can't figure out any logical reason for this, the only way to prevent it is to not import SuccessResponse and declare it in the same file as the function.
Is this a bug in Typescript or am I missing something?