Estou declarando um tipo COMPONENT "pai" que outros tipos de elementos devem satisfazer. O código abaixo funciona bem se eu usá-lo em um arquivo .ts ou .tsx normal (ou seja, ele me mostrará que não posso usar um tipo "herói", pois não faz parte de ELEMENT_TYPE). Entretanto, em um arquivo de declaração, isso simplesmente não funciona.
Como declaro um tipo genérico e depois o uso como um "molde" para encaixar outros tipos mais específicos, tudo em um arquivo de declaração?
declare type ELEMENT_TYPE = "div" | "p" | "h1" | "button";
declare type COMPONENT = {
type: ELEMENT_TYPE;
children: (COMPONENT | string)[];
};
declare type Satisfies<T, U extends T> = U;
declare type HERO = Satisfies<
COMPONENT,
{
type: "hero";
children: (COMPONENT | string)[];
}
>; // should throw error but does not in declaration (.d.ts) file
Meu arquivo tsconfig tem a seguinte aparência:
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
Se quiser que o TypeScript verifique seus arquivos de declaração, você deve desabilitar a
--skipLibCheck
opção do compilador .