compromise
compromise copied to clipboard
Add TypeScript Support for Compromise-Dates
When using TypeScript and 'compromise-dates', the plugin methods do not appear on the base 'Three' type. This breaks compilation on TSC strict projects.
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
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.
you do sound like a TypeScript expert! go for it! thank you, very much.