compromise icon indicating copy to clipboard operation
compromise copied to clipboard

Add TypeScript Support for Compromise-Dates

Open dk4tz opened this issue 1 year ago • 3 comments

When using TypeScript and 'compromise-dates', the plugin methods do not appear on the base 'Three' type. This breaks compilation on TSC strict projects.

image

dk4tz avatar Dec 18 '23 03:12 dk4tz

agh, rats. Thanks @dk4tz I thought this was working. To be honest, I'm still pretty crap at typescript, and may be already past my level of competence. You really seem to know your stuff - wanna take a look? Any changes welcome, either advice or PR cheers

spencermountain avatar Dec 18 '23 16:12 spencermountain

I am not a TypeScript expert either, but I think the issue is that the return type annotation of nlp uses a generic, which will always default to an empty object.

I'm not sure if this the idiomatic way to handle module augmentation, but this approach seems reasonable (and, importantly, works):

// three.d.ts
export interface PluginMethods {}

declare function nlp(text: string, lexicon?: Lexicon): View & PluginMethods

Then, in the plugin's declarations:

// index.d.ts (compromise-dates)
export interface DatesMethods {
  // methods go here
}

declare module 'compromise' {
  interface PluginMethods extends DatesMethods {}
}

This approach immediately augments the module when compromise-dates is pulled in.

One alternative could be to use the return type annotation of nlp.plugin() to infer the correct return type of subsequent calls to the object:

nlp.dates("today") // error
const nlpWithDates = nlp.plugin(datePlugin);
nlpWithDates.dates("today") // no error

This is technically safer, since it would only make TypeScript aware of plugin methods when a plugin is actually registered, but it also means that code in the wild would have to be rewritten to benefit. (It's also a little beyond my current TypeScript skills to implement, though I imagine I could figure it out.)

Either way, I'm happy to put in a PR if this sounds reasonable.

jose-elias-alvarez avatar Mar 27 '24 02:03 jose-elias-alvarez

you do sound like a TypeScript expert! go for it! thank you, very much.

spencermountain avatar Apr 01 '24 15:04 spencermountain