Open EdwardZZZ opened 4 years ago
declare module 'koa' {
interface Context {
session: {
set(key: string, value: any): void;
get(key: string): string;
remove(key: string): void;
};
}
}
declare module 'koa' {
interface Context {
setLocale(locale: string): void
}
}
class Test {
protocol: string;
create(protocol: string) {
this.protocol = protocol;
return this;
}
test() {
console.log(this.protocol);
}
}
function ProxyFactory<T>(clazz: new () => T, protocol: string): T {
return Reflect.construct(clazz, []).create(protocol);
}
ProxyFactory(Test, 'Hello');
const test = new Test();
type MergeParameters<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
type B = {
b: number;
};
type C = {
c: string;
}
type BC = MergeParameters<B | C>
const obj: BC = {
b: 2,
c: 'c',
};
type RouterParameterTypes = string | number | boolean;
// if the type of a property is one of RouterParameterTypes, then convert the type of the property to be the key
type ValidPropertiesToKeys<T> = { [P in keyof T]: T[P] extends RouterParameterTypes ? P : never; };
// get all property types that is not never
type ValidPropertyTypes<T> = T[keyof T];
// remove properties that do not have a type in RouterParameterTypes
type FilterOutInvalidProperties<T> = Pick<T, ValidPropertyTypes<ValidPropertiesToKeys<T>>>;
// A|B|... -> ((k:FIOP<A>)=>void)|((k:FIOP<B>)=>void)|... -> (k:FIOP<A>&FIOP<B>&...)=>void -> FIOP<A>&FIOP<B>&...
type MergeParameters<U> = (U extends any ? (k: FilterOutInvalidProperties<U>) => void : never) extends ((k: infer I) => void) ? I : never;
export interface RouterPattern<T> {
match(url: string): T | undefined;
}
export function route<T>(strings: TemplateStringsArray): RouterPattern<{}>;
export function route<T>(strings: TemplateStringsArray, ...values: T[]): RouterPattern<MergeParameters<T>>;
export function route(strings: TemplateStringsArray, ...values: {}[]): {} {
return {
match(url: string): undefined {
return undefined;
}
};
}
class Base {}
export abstract class IModelService extends Base {
abstract getName(id: number): string;
}
export class ModelService extends IModelService {
getName(id: number): string {
throw new Error("Method not implemented.");
}
}
const service = new ModelService();
console.log(service instanceof Base); // ==> true;
function isExtends(a: object, b: object) {
if (!a) return false;
if (a === b) return true;
return isExtends(Reflect.getPrototypeOf(a), b);
}
console.log(isExtends(ModelService, Base)); // ==> true;
export type UnionToTuple<T> = (
(
(
T extends any
? (t: T) => T
: never
) extends infer U
? (U extends any
? (u: U) => any
: never
) extends (v: infer V) => any
? V
: never
: never
) extends (_: any) => infer W
? [...UnionToTuple<Exclude<T, W>>, W]
: []
);
type A = {
a: number
}
type B = {
b: string
}
type U<T> = T extends any ? (t: T) => T : never
type C = U<A|B>;
type TC<U> = (U extends any
? (u: U) => any
: never
) extends (v: infer V) => any
? V
: never;
type D = TC<A|B>;
type E = TC<U<A|B>>;
type W<T> = TC<U<T>> extends (_: any) => infer W ? W : never;
type F = W<A|B>;
type TT<T> = W<Exclude<A|B, W<A|B>>>
type G = TT<A|B>;