type Roles = 'isUser' | 'isAdmin';
const userHandler = (role: { [K in Roles]: boolean }): void => { ... };
userHandler({'isUser': false});
userHandler({'newKey': true}); // error!
- 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) => { ... });
- 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 { }
}
-
Install
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);
}
}
cp -r [folder] [dest folder]
-
Create aliases of directories and register custom module paths
-
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';