typescript - JSDoc tilldela generisk typ till ett värde
Jag har ett projekt där jag använder JSDoc för att annotera typer och TypeScript-definitionsfiler för att skapa dessa typer på ett mer bekvämt sätt. Jag håller på att överföra några generiska typer från JSDoc till TypeScript, eftersom det är enklare att skriva. Jag upptäckte att jag inte kan tilldela en generisk typ direkt till en variabel eftersom det säger att jag måste ange typargumenten. Så, om jag försöker göra detta:
/*
* @type {import('./api').WithDb}
*/
const withDb = handler => async args => {
Det misslyckas eftersom WithDb kräver två argument, men detta är precis vad jag vill, att säga att detta är en generisk funktion. JSDoc tillåter dig att definiera generiska typer med @template-syntaxen så att jag kan annotera om funktionen på detta sätt:
/*
* @template T
* @template K
* @type {import('./api').WithDb<T,K>}
*/
const withDb = handler => async args => {
ELLER
/*
* @template T,K
* @type {import('./api').WithDb<T,K>}
*/
const withDb = handler => async args => {
Men det är mycket standardkod som jag skulle vilja undvika. Finns det något annat sätt att binda typerna än @type ?
Svar #1
Du är tyvärr fast vid att använda @type. Men du kan på sätt och vis städa upp det genom att sopa standardkoden under mattan:
- Någonstans nära toppen av din fil kan du definiera en
@typedefsom kommer att vara ett alias:
/**
* @template T,K
* @typedef {import('./api').WithDb<T,K>} WithDb
*/
- Då kan din implementering använda din nyskapade alias-typ:
/** @type {WithDb} */
const withDb = handler => async args => {
Lite klumpigt, särskilt eftersom du troligen kommer att ha WithDb i typningsfilen. Men om du använder den typen på många ställen, kommer detta att spara några tecken. JSDoc täcker ett brett spektrum av användningsfall, men det kommer alltid att vara ganska ordrikt.
