A simple tool for creating d.ts in egg application. Injecting controller, proxy, service, etc. to definition type of egg ( such as ContextApplication etc. ) by Declaration Merging, and making IntelliSense works in both egg-js and egg-ts.
egg-ts-helper has build-in in egg-bin, You can easily to use it by
egg-bin dev --dts
or add configuration egg.declarations in package.json
CLI
$ ets -h
Usage: bin [commands] [options]
Options:
-v, --version output the version number
-w, --watch Watching files, d.ts would recreated while file changed
-c, --cwd [path] Egg application base dir (default: process.cwd)
-C, --config [path] Configuration file, The argument can be a file path to a valid JSON/JS configuration file.(default: {cwd}/tshelper
-o, --oneForAll [path] Create a d.ts import all types (default: typings/ets.d.ts)
-s, --silent Running without output
-i, --ignore [dirs] Ignore generator, your can ignore multiple dirs with comma like: -i controller,service
-e, --enabled [dirs] Enable generator, your can enable multiple dirs with comma like: -e proxy,other
-E, --extra [json] Extra config, the value should be json string
-h, --help output usage information
Commands:
clean Clean js file while it has the same name ts/tsx file
init <type> Init egg-ts-helper in your existing project
Configuration
name
type
default
description
cwd
string
process.cwd
egg application base dir
typings
string
{cwd}/typings
typings dir
caseStyle
stringFunction
lower
egg case style(lower,upper,camel) or (filename) => {return 'YOUR_CASE'}
silent
boolean
false
ignore logging
watch
boolean
false
watch file change or not, default to true in register
egg-ts-helper will auto create the d.ts for files under app/model
// This file is created by egg-ts-helper@1.24.1
// Do not modify this file!!!!!!!!!
import 'egg';
type AutoInstanceType<T, U = T extends (...args: any[]) => any ? ReturnType<T> : T> = U extends { new (...args: any[]): any } ? InstanceType<U> : U;
import ExportCastle from '../../../app/model/Castle';
import ExportUser from '../../../app/model/User';
declare module 'egg' {
interface Application {
model: T_custom_model;
}
interface T_custom_model {
Castle: AutoInstanceType<typeof ExportCastle>;
User: AutoInstanceType<typeof ExportUser>;
}
}
And you can easily to use it in your code.
Generator
If you are using loader.loadToApp or loader.loadToContext to load the instance, you should use generator config.
Example
Creating d.ts for files under app/model. You should add config generatorConfig.model in your config file.
// ./tshelper.js
module.exports = {
generatorConfig: {
model: {
directory: 'app/model', // files directory.
// pattern: '**/*.(ts|js)', // glob pattern, default is **/*.(ts|js). it doesn't need to configure normally.
// ignore: '', // ignore glob pattern, default to empty.
generator: 'class', // generator name, eg: class、auto、function、object
interface: 'IModel', // interface name
declareTo: 'Context.model', // declare to this interface
// watch: true, // whether need to watch files
// caseStyle: 'upper', // caseStyle for loader
// interfaceHandle: val => `ReturnType<typeof ${val}>`, // interfaceHandle
// trigger: ['add', 'unlink'], // recreate d.ts when receive these events, all events: ['add', 'unlink', 'change']
}
}
}
The configuration can create d.ts as below.
Attention, The type will merge into egg without any pre handling if the generator field is class, If you dont know how it works, just using generator: 'auto' instead.
import Station from '../../../app/model/station';// <-- find all files under app/model and import then.
declare module 'egg' {
interface Context { // <-- Context is reading from `declareTo`
model: IModel; // <-- IModel is reading from `interface`, It will create a random interface if this field is empty
}
interface IModel { // <-- The same as above.
Station: Station; // <-- Merging `Station` to IModel so we can use `ctx.model.Station` in code.
}
}
Effect of different options
interface string
interface set to IOther.
interface IOther {
Station: Station;
}
It will use random interface if interface is not set.
interface T100 {
Station: Station;
}
Attentions: Must set declareTo if interface is not set.
generator string
The name of generator, available value is classfunctionobjectauto.
generator: 'class'
the types created by class generator as below
interface IModel {
Station: Station;
}
It’s suitable for module wrote like this
export default class XXXController extends Controller { }
generator: 'function' ( Support since 1.16.0 )
the types created by function generator as below
interface IModel {
Station: ReturnType<typeof Station>; // Using ReturnType to get return type of function.
}
It’s suitable for module like this
export default () => {
return {};
}
generator: 'object' ( Support since 1.16.0 )
the types created by object generator as below.
interface IModel {
Station: typeof Station;
}
It’s suitable for module like this
export default {}
generator: 'auto' ( Support since 1.19.0 )
the types created by auto generator as below. It will check types automatically.
type AutoInstanceType<T, U = T extends (...args: any[]) => any ? ReturnType<T> : T> = U extends { new (...args: any[]): any } ? InstanceType<U> : U;
interface IModel {
Station: AutoInstanceType<typeof Station>;
}
It’s suitable for every module in above.
interfaceHandle function|string
If you cannot find suitable generator in above, you can config the type by this field.
egg-ts-helper
A simple tool for creating
d.tsin egg application. Injectingcontroller, proxy, service, etc.to definition type of egg ( such asContextApplicationetc. ) by Declaration Merging, and making IntelliSense works in both egg-js and egg-ts.Install
open your application and install.
QuickStart
Open your egg application, executing ets by npx
Watching files by
-wflag.egg-ts-helperhas build-in inegg-bin, You can easily to use it byor add configuration
egg.declarationsinpackage.jsonCLI
Configuration
stringstringstringFunction(filename) => {return 'YOUR_CASE'}booleanbooleantrueinregisterobjectbooleanstringobjectYou can configure the options above in
./tshelper.js./tshelper.jsonorpackage.json.In
tshelper.jsIn
tshelper.jsonIn
package.jsonor use
dot-propAlso you can pass options by env ( support since 1.22.0 )
ETS_CWD: cwdETS_FRAMEWORK: frameworkETS_TYPINGS: typingsETS_CASE_STYLE: caseStyleETS_AUTO_REMOVE_JS: autoRemoveJsETS_THROTTLE: throttleETS_WATCH: watchETS_SILENT: silentETS_CONFIG_FILE: configFileCustom Loader
egg-ts-helpersupport customLoader configuration of egg. see https://github.com/eggjs/egg/issues/3480Configure in
config.default.tsegg-ts-helperwill auto create the d.ts for files underapp/modelAnd you can easily to use it in your code.
Generator
If you are using
loader.loadToApporloader.loadToContextto load the instance, you should use generator config.Example
Creating
d.tsfor files underapp/model. You should add configgeneratorConfig.modelin your config file.The configuration can create d.ts as below.
Effect of different options
interface
stringinterfaceset toIOther.It will use random interface if
interfaceis not set.Attentions: Must set
declareToifinterfaceis not set.generator
stringThe name of generator, available value is
classfunctionobjectauto.generator: 'class'the types created by
classgenerator as belowIt’s suitable for module wrote like this
generator: 'function'( Support since1.16.0)the types created by
functiongenerator as belowIt’s suitable for module like this
generator: 'object'( Support since1.16.0)the types created by
objectgenerator as below.It’s suitable for module like this
generator: 'auto'( Support since1.19.0)the types created by
autogenerator as below. It will check types automatically.It’s suitable for every module in above.
interfaceHandle
function|stringIf you cannot find suitable generator in above, you can config the type by this field.
The generated typings.
The type of
interfaceHandlecan bestring( Support since1.18.0)The generated typings are the same as above.
{{ 0 }}means the first argument in function.caseStyle
function|stringcaseStylecan set tolower、upper、camelor functiondeclareTo
stringDeclaring interface to definition of egg. ( Support since
1.15.0)declareToset toContext.model, and you can get intellisense byctx.model.xxxdeclareToset toApplication.model.subModel, and you can get intellisense byapp.model.subModel.xxxDefining custom generator
or define generator to other js.
configure in
tshelper.jsorpackage.jsonDemo
egg-ts-helpercan works in bothtsandjsegg project.TS demo: https://github.com/whxaxes/egg-boilerplate-d-ts
JS demo: https://github.com/whxaxes/egg-boilerplate-d-js
License
MIT
Contributors
Made with contributors-img.