spencermountain / compromise

modest natural-language processing
http://compromise.cool
MIT License
11.31k stars 645 forks source link

Add TypeScript Support for Compromise-Dates #1067

Open dk4tz opened 6 months ago

dk4tz commented 6 months ago

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
spencermountain commented 6 months ago

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

jose-elias-alvarez commented 3 months ago

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.

spencermountain commented 3 months ago

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