samnoh / ts-express

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TypeScript + Express.js

TIL

Mapped Types

type Roles = 'isUser' | 'isAdmin';
const userHandler = (role: { [K in Roles]: boolean }): void => { ... };

userHandler({'isUser': false});
userHandler({'newKey': true}); // error!

Express

  • Type Definition
npm install --save-dev @types/express
  • Usage
import express, { Express, Request, Response, NextFunction } from 'express';
const app: Express = express();
app.get('/', (req: Request, res: Response, next: NextFunction) => { ... });

d.ts

  • Triple-Slash Directives
    • import type definition in TypeScript
/// <reference types="modulename" />
  • namespace
    • internal modules
    • interfaces can be merged (override)
import modulename = require('modulename');

declare namespace "modulename" {
    export interface aaa { }
    export class bbb { }
}

reflect-metadata

npm install --save-dev reflect-metadata
  • tsconfig.json
"experimentalDecorators": true,
"emitDecoratorMetadata": true
  • Reflect.defineMetadata(metadataKey, metadataValue, C.prototype, "method")
  • Reflect.getMetadata(metadataKey, obj, "method")
import 'reflect-metadata';

@classDeco
class User {
    name: string = 'smith';

    @describeUser('happy', 'kind', 'verbose'); // -> 'happy kind verbose'
    printName(): void {
        console.log(this.name);
    }
}

function classDeco(target: any) {
    for (let key in target.prototype) {
        const description: string[] = Reflect.getMetadata('desc', target.prototype, key) || [];
        console.log(...description);
    }
}

function describeUser(...keys: string[]) {
    return function (target: any, key: string, desc: PropertyDescriptor) {
        Reflect.defineMetadata('desc', keys, target, key);
    }
}

Unix Copy

cp -r [folder] [dest folder]

module-alias

  • Create aliases of directories and register custom module paths

  • npm

  • Install

npm install --save module-alias
  • import
import 'module-alias/register'; // at the very main file of your app, before any code
  • tsconfig.json
"baseUrl": "./src",
"path": {
    "@util": ["util/index"],
    "@lib/*": ["lib/*"]
}
  • package.json
"_moduleAliases": {
    "@util": "build/util/index.js",
    "@lib": "build/lib"
}
  • Usage
import { foo } from '@util';
import { getUsers } from '@lib/users';

About


Languages

Language:TypeScript 74.8%Language:HTML 25.2%