• Stars
    star
    294
  • Rank 141,303 (Top 3 %)
  • Language
    TypeScript
  • Created over 2 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ts-all-in-one

์‹ค์Šตํ•  ์ž๋ฃŒ ๋งํฌ(์†Œ์Šค ์ฝ”๋“œ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋ณ€๋™ ๊ฐ€๋Šฅ)

์• ์ดˆ์— ts์ธ redux, ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์—์„œ d.ts๋ฅผ ์ œ๊ณตํ•˜๋Š” axios, @types ํŒจํ‚ค์ง€๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋Š” react, node, express, jquery๋กœ ๊ตฌ๋ถ„๋จ. @types๋Š” DefinitelyTyped๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋กœ, ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ€์ดํ•‘์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ.

๊ธฐ๋ณธ ์ง€์‹

  • ๋ฉ”์ธ ๋ฃฐ: typescript๋Š” ์ตœ์ข…์ ์œผ๋กœ javascript๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ˆœ์ „ํ•œ typescript ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ deno์ด๋‚˜ ๋Œ€์ค‘ํ™”๋˜์ง€๊ฐ€ ์•Š์•˜์Œ. ๋ธŒ๋ผ์šฐ์ €, ๋…ธ๋“œ๋Š” ๋ชจ๋‘ js ํŒŒ์ผ์„ ์‹คํ–‰ํ•œ๋‹ค.
  • typescript๋Š” ์–ธ์–ด์ด์ž ์ปดํŒŒ์ผ๋Ÿฌ(tsc)์ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ts ์ฝ”๋“œ๋ฅผ js๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
  • tsc๋Š” tsconfig.json(tsc --init ์‹œ ์ƒ์„ฑ)์— ๋”ฐ๋ผ ts ์ฝ”๋“œ๋ฅผ js(tsc ์‹œ ์ƒ์„ฑ)๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ธํ’‹์ธ ts์™€ ์•„์›ƒํ’‹์ธ js ๋ชจ๋‘์— ์˜ํ–ฅ์„ ๋ผ์น˜๋ฏ€๋กœ tsconfig.json ์„ค์ •์„ ๋ฐ˜๋“œ์‹œ ๋ด์•ผํ•œ๋‹ค.
  • ๋‹จ์ˆœํžˆ ํƒ€์ž… ๊ฒ€์‚ฌ๋งŒ ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด tsc --noEmit ํ•˜๋ฉด ๋œ๋‹ค.
  • ๊ฐœ์ธ ์˜๊ฒฌ: tsconfig.json์—์„œ ๊ทธ๋ƒฅ esModuleInterop: true, strict: true ๋‘ ๊ฐœ๋งŒ ์ฃผ๋กœ ์ผœ๋†“๋Š” ํŽธ. strict: true๊ฐ€ ํ•ต์‹ฌ์ž„.
  • ts ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฒฐ๊ณผ๋ฌผ์ธ js๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
  • ์—๋””ํ„ฐ๊ฐ€ ํ•„์ˆ˜๊ฐ€ ๋จ. VS Code๋‚˜ ์›น์Šคํ†ฐ ๋ฐ˜๋“œ์‹œ ํ•„์š”. ๋ฉ”๋ชจ์žฅ์œผ๋กœ ์ฝ”๋”ฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ง€๊ฒฝ์— ์ด๋ฆ„.

ts ๋ฌธ๋ฒ•

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€์ˆ˜, ์†์„ฑ, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด๊ฐ’์— ํƒ€์ž…์ด ๋ถ™์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ.
const a: number = 5;
function add(x: number, y: number): number { return x + y }
const add: (x: number, y: number) => number = (x, y) => x + y;
const obj: { lat: number, lon: number } = { lat: 37.5, lon: 127.5 };
  • ํŠน์ˆ˜ํ•œ ํƒ€์ž… {} (null๊ณผ undefined๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ํƒ€์ž…)
const z: {} = 5;
  • ts๊ฐ€ ์ถ”๋ก ํ•ด์ฃผ๋Š” ํƒ€์ž…์ด ์žˆ๋Š”๋ฐ ์ด๋Ÿฐ ๊ฑด ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋จ. ts๊ฐ€ ์ถ”๋ก ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ง์ ‘ ํƒ€์ดํ•‘ํ•  ๊ฒƒ.
const a = 5;
const b = '3';
const c = a + b;
function add(x: number, y: number) { return x + y }
  • : ๋’ท๋ถ€๋ถ„, as ๋’ท๋ถ€๋ถ„, <> ๋ถ€๋ถ„, interface, type, function ์ผ๋ถ€๋ฅผ ์ œ์™ธํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋™์ผ. ์ œ์™ธํ•˜๊ณ  ์ƒ๊ฐํ•˜๋Š” ์—ฐ์Šต์„ ์ดˆ๋ฐ˜์— ํ•ด์•ผ ํ•จ.
const obj: { lat: number, lon: number } = { lat: 37.5, lon: 127.5 };
const obj = { lat: 37.5, lon: 127.5 };

const a = document.querySelector('#root') as HTMLDivElement;
const a = document.querySelector('#root');

function add<T>(x: T, y: T): T { return x + y }
function add(x, y) { return x + y }

interface A {};
type A = {};
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋น„ํ•ด์„œ ์ž์œ ๋„๊ฐ€ ํ™• ์ค„์–ด๋“ฆ(ex: ๋ณ€์ˆ˜์— ๋ฌธ์ž์—ด์„ ๋„ฃ์—ˆ๋‹ค๊ฐ€ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋Š” ๋“ฑ์˜ ํ–‰๋™ ์–ด๋ ค์›Œ์ง)
let x = 5;
x = 'hello';
  • any๋ฅผ ์ตœ๋Œ€ํ•œ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•  ๊ฒƒ.
  • never, unknown, any ํƒ€์ž… ์ฃผ์˜ํ•˜๊ธฐ. any๋Š” ์ตœ๋Œ€ํ•œ ํ”ผํ•˜๊ณ  ์“ฐ๋”๋ผ๋„ ๋‚˜์ค‘์— ๊ผญ ์ œ๋Œ€๋กœ ํƒ€์ดํ•‘ํ•˜๊ธฐ. never ์ข‹์€ ์„ค๋ช… ๊ธ€
try {
  const array = []; // noImplicitAny๊ฐ€ false์ผ ๋•Œ
  array[0];
} catch(error) {
  error;
}
  • ์ตœ๋Œ€ํ•œ ! ๋Œ€์‹  if๋ฅผ ์“ธ ๊ฒƒ
const head = document.querySelector('#head')!;
console.log(head);

const head = document.querySelector('#head');
if (head) {
  console.log(head);
}
  • string๊ณผ String์€ ๋‹ค๋ฆ„. ์†Œ๋ฌธ์ž๋กœ ํ•˜๋Š” ๊ฒƒ ๊ธฐ์–ตํ•˜๊ธฐ.
const a: string = 'hello';
const b: String = 'hell';
  • ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์ด ์กด์žฌ(์œ ๋‹ˆ์–ธ ๋“ฑ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
type World = "world" | "hell";

// type Greeting = "hello world"
type Greeting = `hello ${World}`;
  • ๋ฐฐ์—ด, ํŠœํ”Œ ๋ฌธ๋ฒ•
let arr: string[] = [];
let arr2: Array<string> = [];
function rest(...args: string[]) {}

const tuple: [string, number] = ['1', 1];
tuple[2] = 'hello';
tuple.push('hello');
  • enum, keyof, typeof
const enum EDirection {
  Up,
  Down,
  Left,
  Right,
}
 
const ODirection = {
  Up: 0,
  Down: 1,
  Left: 2,
  Right: 3,
} as const;
 
EDirection.Up;
           
(enum member) EDirection.Up = 0
 
ODirection.Up;
           
(property) Up: 0
 
// Using the enum as a parameter
function walk(dir: EDirection) {}
 
// It requires an extra line to pull out the keys
type Direction = typeof ODirection[keyof typeof ODirection];
function run(dir: Direction) {}
 
walk(EDirection.Left);
run(ODirection.Right);
  • ๊ฐ์ฒด ํƒ€์ดํ•‘: type๊ณผ interface ๊ตฌ๋ถ„ํ•˜๊ธฐ
type A = { a: string };
const a: A = { a: 'hello' };

interface B { a: string }
const b: B = { a: 'hello' };
  • union, intersection
function add(x: string | number, y: string | number): string | number { return x + y }
add(1, 2)
add('1', '2')
add(1, '2')

type A = {
    a: string;
}
type B = {
    b: string;
}

const aa: A | B = { a: 'hello', b: 'world' };
const bb: A & B = { a: 'hello', b: 'world' };
  • interface๋ผ๋ฆฌ๋Š” ์„œ๋กœ ํ•ฉ์ณ์ง.
interface A { a: string }
interface A { b: string }
const obj1: A = { a: 'hello', b: 'world' }

type B = { a: string }
type B = { b: string }
const obj2: B = { a: 'hello', b: 'world' }
  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์€ ์ž‰์—ฌ ์†์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์Œ.
type A = { hello: string };
const a: A = { hello: 'world', why: 'error' };

const b = { hello: 'world', why: 'error' };
const c: A = b;
  • void ํƒ€์ž…์€ return๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•ˆ ๊ฒ ๋‹ค๋Š” ๋œป(๋ฉ”์„œ๋“œ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ๋Š” ๋ฆฌํ„ด๊ฐ’ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, but ์กฐ์‹ฌํ•ด์•ผ ํ•จ)
declare function forEach<T>(arr: T[], callback: (el: T) => undefined): void;
// declare function forEach<T>(arr: T[], callback: (el: T) => void): void;
let target: number[] = [];
forEach([1, 2, 3], el => target.push(el));

interface A {
    talk: () => void;
}
const a: A = {
    talk() { return 3; }
}
  • ํƒ€์ž…๋งŒ ์„ ์–ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ declare(๊ตฌํ˜„์€ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žˆ์–ด์•ผ ํ•จ)
declare const a: string;
declare function a(x: number): number;
declare class A {}

// ์ถ”ํ›„ declare module, declare global, declare namespace๋„ ๋ฐฐ์›€
  • ํƒ€์ž…๊ฐ„ ๋Œ€์ž… ๊ฐ€๋Šฅ ํ‘œ image

  • ํƒ€์ž… ๊ฐ€๋“œ

function numOrStr(a: number | string) {
  if (typeof a === 'string') {
    a.split(',');  
  } else {
    a.toFixed(1);
  }
}

function numOrNumArr(a: number | number[]) {
  if (Array.isArray(a)) {
    a.slice(1);  
  } else {
    a.toFixed(1);
  }
}

type B = { type: 'b', bbb: string };
type C = { type: 'c', ccc: string };
type D = { type: 'd', ddd: string };
type A = B | C | D;
function typeCheck(a: A) {
  if (a.type === 'b') {
    a.bbb;
  } else if (a.type === 'c') {
    a.ccc;
  } else {
    a.ddd;
  }
}

interface Cat { meow: number }
interface Dog { bow: number }
function catOrDog(a: Cat | Dog): a is Dog {
  if ((a as Cat).meow) { return false }
  return true;
}
const cat: Cat | Dog = { meow: 3 }
if (catOrDog(cat)) {
    console.log(cat.meow);
}
if ('meow' in cat) {
    console.log(cat.meow);
}

const isRejected = (input: PromiseSettledResult<unknown>): input is PromiseRejectedResult => input.status === 'rejected';
const isFulfilled = <T>(input: PromiseSettledResult<T>): input is PromiseFulfilledResult<T> => input.status === 'fulfilled';

const promises = await Promise.allSettled([Promise.resolve('a'), Promise.resolve('b')]);
const errors = promises.filter(isRejected);

class์ธ ๊ฒฝ์šฐ instanceof ์—ฐ์‚ฐ์ž๋„ ๊ฐ€๋Šฅ!

  • readonly
interface A {
  readonly a: string;
  b: string;
}
  • class์— private, protected ์ถ”๊ฐ€๋จ
class B implements A {
  private a: string;
  protected b: string;
}
class C extends B {}
new C().a;
new C().b;
  • abstract class, abstract method
abstract class X {
  abstract work(user: User): boolean;
}
class Y extends X {
  work(user: User): boolean {
    return true;
  }
}
  • abstract class, abstract ์ƒ์„ฑ์ž
const constructor: abstract new (...args: any) => any = ...
  • class vs interface

๋Ÿฐํƒ€์ž„์—์„œ ์žˆ๋ƒ ์—†๋ƒ.

  • optional
function abc(a: number, b?: number, c: number?) {}
abc(1)
abc(1, 2)
abc(1, 2, 3)

let obj: { a: string, b?: string }  = { a: 'hello', b: 'world' }
obj = { a: 'hello' };
  • ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ. ์ถ”๋ก ์„ ํ™œ์šฉํ•˜๊ธฐ
function add<T>(x: T, y: T): T { return x + y }
add<number>(1, 2);
add(1, 2);
add<string>('1', '2');
add('1', '2');
add(1, '2');
  • ์ œ๋„ค๋ฆญ ์„ ์–ธ ์œ„์น˜ ๊ธฐ์–ตํ•˜๊ธฐ
function a<T>() {}
class B<T>() {}
interface C<T> {}
type D<T> = {};
const e = <T>() => {};
  • ์ œ๋„ค๋ฆญ ๊ธฐ๋ณธ๊ฐ’, extends
function add<T extends string>(x: T, y: T): T { return x + y }
add(1, 2);
add('1', '2')

// <T extends {...}> // ํŠน์ • ๊ฐ์ฒด
// <T extends any[]> // ๋ชจ๋“  ๋ฐฐ์—ด
// <T extends (...args: any) => any> // ๋ชจ๋“  ํ•จ์ˆ˜
// <T extends abstract new (...args: any) => any> // ์ƒ์„ฑ์ž ํƒ€์ž…
// <T extends keyof any> // string | number | symbol
  • ํ•จ์ˆ˜์—์„œ ๊ณต๋ณ€์„ฑ๊ณผ ๋ฐ˜๊ณต๋ณ€์„ฑ ์ฃผ์˜!
function a(x: string): number {
  return 0;
}
type B = (x: string) => number | string;
let b: B = a;

function a(x: string): number | string {
  return 0;
}
type B = (x: string) => number;
let b: B = a;

function a(x: string | number): number {
  return 0;
}
type B = (x: string) => number;
let b: B = a;

function a(x: string): number {
  return 0;
}
type B = (x: string | number) => number;
let b: B = a;
  • ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ
function add(x: number, y: number): number
function add(x: string, y: string): string
function add(x: any, y: any) {
  return x + y;
}

interface Add {
  (x: number, y: number): number;
  (x: string, y: string): string;
}
const add: Add = (x: any, y: any) => x + y;
  • infer๋Š” ํƒ€์ž… ๋‚ด์—์„œ ์ถ”๋ก ๋œ ๊ฐ’์œผ๋กœ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ(๋ฐ‘์— utility types ์ฐธ๊ณ ).
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฑด๋ง์ฆ์ด ์‹ฌํ•˜๋‹ค
try {
  await axios.get();
} catch (err) {
  console.error(err.response?.data);
}
  • this ํƒ€์ดํ•‘
function (this: Window, a: number, b: number) {
  console.log(this);
}

utility types๋กœ ์•Œ์•„๋ณด๊ธฐ

๋งํฌ

  • Partial
type Partial<T> = {
    [P in keyof T]?: T[P];
};
  • Required
type Required<T> = {
    [P in keyof T]-?: T[P];
};
  • ReadOnly
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};
  • Pick
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};
  • Record
type Record<K extends keyof any, T> = {
    [P in K]: T;
};
  • Exclude
type Exclude<T, U> = T extends U ? never : T;
  • Extract
type Extract<T, U> = T extends U ? T : never;
  • Omit
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
  • NonNullable
type NonNullable<T> = T extends null | undefined ? never : T;
  • Parameters
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
  • ConstructorParameters
type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;
  • ReturnType
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
  • InstanceType
type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;
  • ๊ธฐํƒ€
/**
 * Convert string literal type to uppercase
 */
type Uppercase<S extends string> = intrinsic;

/**
 * Convert string literal type to lowercase
 */
type Lowercase<S extends string> = intrinsic;

/**
 * Convert first character of string literal type to uppercase
 */
type Capitalize<S extends string> = intrinsic;

/**
 * Convert first character of string literal type to lowercase
 */
type Uncapitalize<S extends string> = intrinsic;

function applyStringMapping(symbol: Symbol, str: string) {
    switch (intrinsicTypeKinds.get(symbol.escapedName as string)) {
        case IntrinsicTypeKind.Uppercase: return str.toUpperCase();
        case IntrinsicTypeKind.Lowercase: return str.toLowerCase();
        case IntrinsicTypeKind.Capitalize: return str.charAt(0).toUpperCase() + str.slice(1);
        case IntrinsicTypeKind.Uncapitalize: return str.charAt(0).toLowerCase() + str.slice(1);
    }
    return str;
}

/**
 * Marker for contextual 'this' type
 */
interface ThisType<T> { }

ts ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„์„

  • package.json์˜ types ์†์„ฑ์— ์ ํžŒ ํŒŒ์ผ์ด ๋ฉ”์ธ ํƒ€์ดํ•‘ ํŒŒ์ผ์ž„.
  • npmjs.com์—์„œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ํŒจํ‚ค์ง€ ์šฐ์ธก์— TS๋กœ ๋œจ๋ฉด ts ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , DT๋กœ ๋œจ๋ฉด @types๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๊ฒƒ๋งˆ์ €๋„ ์—†์œผ๋ฉด ์ง์ ‘ ํƒ€์ดํ•‘ํ•ด์•ผ ํ•จ
  • ์ฒซ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ ๋ณด๊ธฐ ๋ณด๋‹ค๋Š” ๋งˆ์ง€๋ง‰ ์ค„ exports default๋‚˜ export = ๋ถ€๋ถ„์„ ๋ณด๊ณ  ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒŒ ์ข‹์Œ
  • ์ œ๋„ค๋ฆญ์ด ์ œ์ผ ์ฝ๊ธฐ ์–ด๋ ค์›Œ์„œ ์ œ๋„ค๋ฆญ ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ํ•„๊ธฐํ•˜๋ฉด์„œ ๋ณด๋Š”๊ฒŒ ์ข‹์Œ

๋ชจ๋“ˆ ์‹œ์Šคํ…œ

๋ชจ๋“ˆ vs ์Šคํฌ๋ฆฝํŠธ

top level import/export๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋“ˆ. ์—†์œผ๋ฉด ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ

  • ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋ฉด ์ „์—ญ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•จ
  • ๋‹ค์Œ์€ export๊ฐ€ top level์— ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“ˆ ์•„๋‹˜, ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ž„
declare module "hello" {
  export default class {}
}

๋ชจ๋“ˆ ์ข…๋ฅ˜

// commonjs
export = A // export ๋ฐฉ์‹
import A = require('a') // import(module = commonjs)
import * as A from 'a'; // import(module = es2015, esModuleInterop = false)
import A from 'a'; // import(module = es2015, esModuleInterop = true)

// UMD
export = A // commonjs๋ฅผ ์œ„ํ•ด
export as namespace A // ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์œ„ํ•ด, ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ๋Š” import ์—†์ด namespace๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ

// ESM, ํ‘œ์ค€, ๊ถŒ์žฅ ๋ฐฉ์‹
export default A;
import A from 'a';

export * from '๋ชจ๋“ˆ๋ช…' // ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ์ž„ํฌํŠธํ•œ ๋‹ค์Œ์— ๋‹ค์‹œ export, default ๋ชป ๊ฐ€์ ธ์˜ค๊ณ  commonjs ๋ชจ๋“ˆ๋„ ๋ชป ๊ฐ€์ ธ์˜ด
export * as namespace from '๋ชจ๋“ˆ๋ช…' // ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ์ž„ํฌํŠธํ•œ๋‹ค์Œ์— as์— ์ ํžŒ namespace๋Œ€๋กœ export(default ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ, commonjs ๋ชจ๋“ˆ ๋ชป ๊ฐ€์ ธ์˜ด)
import { namespace } from '๋ชจ๋“ˆ๋ช…'; namespace.default; // ์ด ๋ฐฉ์‹์œผ๋กœ default ์ ‘๊ทผ ๊ฐ€๋Šฅ

declare global, declare module

declare global๋Š” ๋ชจ๋“ˆ์ด์–ด์•ผ ํ•ด์„œ top level import/export ํ•„์š”

declare global {
  interface Error {}
}
export {} // export๋‚˜ import ํ•„์š”

์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ „์—ญ์ด๋ฏ€๋กœ declare global ์—†์ด ๊ทธ๋ƒฅ ์“ฐ๋ฉด ๋จ

interface Error {}

declare module์„ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ํ•˜๋ฉด ๊ธฐ์กด ํƒ€์ž… ์„ ์–ธ ๋Œ€์ฒด, ๋ชจ๋“ˆ ํŒŒ์ผ์— ํ•˜๋ฉด ๊ธฐ์กด ํƒ€์ž… ์„ ์–ธ๊ณผ ๋ณ‘ํ•ฉ๋จ.

declare module "express-session" {
  interface SessionData {
    sessionData: string;
  }
}
export {} // ์žˆ๋ƒ ์—†๋ƒ๊ฐ€ ๋ชจ๋“ˆ/์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๊ฒฐ์ •ํ•˜๋ฏ€๋กœ ์ค‘์š”

jQuery์˜ ํƒ€์ดํ•‘

$( "p" ).removeClass( "myClass noClass" ).addClass( "yourClass" );
$(["p", "t"]).text("hello");
const tag = $( "ul li" ).addClass(function( index ) {
  return "item-" + index;
});
$(tag).html(function (i: number) {
  console.log(this);
  return $(this).data('name') + '์ž…๋‹ˆ๋‹ค';
});
export = jQuery;

declare const jQuery: JQueryStatic;
declare const $: JQueryStatic;

interface JQueryStatic {
  <TElement extends HTMLElement = HTMLElement>(html: JQuery.htmlString, ownerDocument_attributes?: Document | JQuery.PlainObject): JQuery<TElement>;
  <TElement extends Element = HTMLElement>(selector: JQuery.Selector, context?: Element | Document | JQuery | JQuery.Selector): JQuery<TElement>;
}

interface JQuery<TElement = HTMLElement> extends Iterable<TElement> {
  addClass(className_function: JQuery.TypeOrArray<string> | ((this: TElement, index: number, currentClassName: string) => string)): this;
  removeClass(className_function?: JQuery.TypeOrArray<string> | ((this: TElement, index: number, className: string) => string)): this;
  on<TType extends string>(
    events: TType,
    handler: JQuery.TypeEventHandler<TElement, undefined, TElement, TElement, TType> | false
  ): this;
}

axios์˜ ํƒ€์ดํ•‘

index.d.ts

declare const axios: AxiosStatic;
export default axios;

export interface AxiosStatic extends AxiosInstance {
  create(config?: CreateAxiosDefaults): AxiosInstance;
  Cancel: CancelStatic;
  CancelToken: CancelTokenStatic;
  Axios: typeof Axios;
  AxiosError: typeof AxiosError;
  readonly VERSION: string;
  isCancel(value: any): value is Cancel;
  all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
  spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
  isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;
  toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData;
  formToJSON(form: GenericFormData|GenericHTMLFormElement): object;
}

export interface AxiosInstance extends Axios {
  <T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): AxiosPromise<R>;
  <T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): AxiosPromise<R>;

  defaults: Omit<AxiosDefaults, 'headers'> & {
    headers: HeadersDefaults & {
      [key: string]: AxiosHeaderValue
    }
  };
}

export class Axios {
  constructor(config?: AxiosRequestConfig);
  defaults: AxiosDefaults;
  interceptors: {
    request: AxiosInterceptorManager<AxiosRequestConfig>;
    response: AxiosInterceptorManager<AxiosResponse>;
  };
  getUri(config?: AxiosRequestConfig): string;
  request<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
  get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
  delete<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
  head<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
  options<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
  post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
  put<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
  patch<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
  postForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
  putForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
  patchForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
}

export interface AxiosResponse<T = any, D = any>  {
  data: T;
  status: number;
  statusText: string;
  headers: RawAxiosResponseHeaders | AxiosResponseHeaders;
  config: AxiosRequestConfig<D>;
  request?: any;
}

react์˜ ํƒ€์ดํ•‘

์†Œ์Šค ๋งํฌ

export = React; declare namespace React, declare global, namespace JSX

import React = require('react');
import * as React from 'react';
React.useEffect

return์— ๋ฌด์—‡์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„๊นŒ? JSX, string, null?

function App(): JSX.Element {
  ...
}

const App: FC<{}> = () => <div />;

interface Element extends React.ReactElement<any, any> { }

interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> {
    type: T;
    props: P;
    key: Key | null;
}

type JSXElementConstructor<P> =
        | ((props: P) => ReactElement<any, any> | null)
        | (new (props: P) => Component<any, any>);
      
class Component<P, S> {
  render(): ReactNode;
}

interface FunctionComponent<P = {}> {
//    (props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null; // React17
    (props: P, context?: any): ReactElement<any, any> | null;
    propTypes?: WeakValidationMap<P> | undefined;
    contextTypes?: ValidationMap<any> | undefined;
    defaultProps?: Partial<P> | undefined;
    displayName?: string | undefined;
}

type ReactText = string | number;
type ReactChild = ReactElement | ReactText;
type ReactFragment = {} | Iterable<ReactNode>;
type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
interface ReactPortal extends ReactElement {
    key: Key | null;
    children: ReactNode;
}

type FC<P = {}> = FunctionComponent<P>;

interface FunctionComponent<P = {}> {
    (props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
    propTypes?: WeakValidationMap<P> | undefined;
    contextTypes?: ValidationMap<any> | undefined;
    defaultProps?: Partial<P> | undefined;
    displayName?: string | undefined;
}

type VFC<P = {}> = VoidFunctionComponent<P>;

interface VoidFunctionComponent<P = {}> {
    (props: P, context?: any): ReactElement<any, any> | null;
    propTypes?: WeakValidationMap<P> | undefined;
    contextTypes?: ValidationMap<any> | undefined;
    defaultProps?: Partial<P> | undefined;
    displayName?: string | undefined;
}

ํ›… ํƒ€์ดํ•‘

function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];

type SetStateAction<S> = S | ((prevState: S) => S);
type Dispatch<A> = (value: A) => void;

function useRef<T>(initialValue: T): MutableRefObject<T>;
function useRef<T>(initialValue: T|null): RefObject<T>;
function useRef<T = undefined>(): MutableRefObject<T | undefined>;

interface MutableRefObject<T> {
    current: T;
}
interface RefObject<T> {
    readonly current: T | null;
}

function useLayoutEffect(effect: EffectCallback, deps?: DependencyList): void;
function useEffect(effect: EffectCallback, deps?: DependencyList): void;

type EffectCallback = () => (void | Destructor);
type DependencyList = ReadonlyArray<unknown>;
type Destructor = () => void | { [UNDEFINED_VOID_ONLY]: never };

function useCallback<T extends Function>(callback: T, deps: DependencyList): T;
function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;

tsconfig.json "jsx": "react"๋กœ

import * as React from 'react';
import { useState, useCallback, useRef } from 'react';

const WordRelay = () => {
    const [word, setWord] = useState('์ œ๋กœ์ดˆ');
    const [value, setValue] = useState('');
    const [result, setResult] = useState('');
    const inputEl = useRef(null);

    const onSubmitForm = useCallback((e) => {
        e.preventDefault();
        const input = inputEl.current;
        if (word[word.length - 1] === value[0]) {
          setResult('๋”ฉ๋™๋Œ•');
          setWord(value);
          setValue('');
          if (input) {
            input.focus();
          }
        } else {
          setResult('๋•ก');
          setValue('');
          if (input) {
            input.focus();
          }
        }
    }, [word, value]);

    const onChange = useCallback((e) => {
        setValue(e.currentTarget.value) 
    }, []);

    return (
        <>
          <div>{word}</div>
          <form onSubmit={onSubmitForm}>
            <input
              ref={inputEl}
              value={value}
              onChange={onChange}
            />
            <button>์ž…๋ ฅ!</button>
          </form>
          <div>{result}</div>
        </>
      );
};

export default WordRelay;

redux์˜ ํƒ€์ดํ•‘

export interface Dispatch<A extends Action = AnyAction> {
  <T extends A>(action: T, ...extraArgs: any[]): T
}

export interface Action<T = any> {
  type: T
}

export interface AnyAction extends Action {
  // Allows any extra properties to be defined in an action.
  [extraProps: string]: any
}

export interface ActionCreator<A, P extends any[] = any[]> {
  (...args: P): A
}

export type Reducer<S = any, A extends Action = AnyAction> = (
  state: S | undefined,
  action: A
) => S

export interface MiddlewareAPI<D extends Dispatch = Dispatch, S = any> {
  dispatch: D
  getState(): S
}

export interface Middleware<
  _DispatchExt = {}, // TODO: remove unused component (breaking change)
  S = any,
  D extends Dispatch = Dispatch
> {
  (api: MiddlewareAPI<D, S>): (
    next: D
  ) => (action: D extends Dispatch<infer A> ? A : never) => any
}

react-redux์˜ ํƒ€์ดํ•‘

export const useSelector = /*#__PURE__*/ createSelectorHook()

export function createSelectorHook(
  context = ReactReduxContext
): <TState = unknown, Selected = unknown>(
  selector: (state: TState) => Selected,
  equalityFn?: EqualityFn<Selected>
) => Selected {
}

export const useDispatch = /*#__PURE__*/ createDispatchHook()

export function createDispatchHook<
  S = unknown,
  A extends Action = AnyAction
  // @ts-ignore
>(context?: Context<ReactReduxContextValue<S, A>> = ReactReduxContext) {
  const useStore =
    // @ts-ignore
    context === ReactReduxContext ? useDefaultStore : createStoreHook(context)

  return function useDispatch<
    AppDispatch extends Dispatch<A> = Dispatch<A>
  >(): AppDispatch {
    const store = useStore()
    // @ts-ignore
    return store.dispatch
  }
}

Provider ์†Œ์Šค ๋งํฌ ํ›… ์†Œ์Šค ๋งํฌ

Node์˜ ํƒ€์ดํ•‘

<reference path="..."์€ ํ•ด๋‹น ํŒŒ์ผ์˜ ํƒ€์ž…๋“ค์„ ๋Œ๊ณ  ์˜ค๋Š” ๊ฒƒ. ์š”์ฆ˜ ํ•  ํ•„์š” ์—†์Œ d.ts ํŒŒ์ผ์— declare module 'fs:promises'๋กœ import 'fs:promises' ํ•  ๋•Œ ์–ด๋–ค ํƒ€์ž…์ด ๋  ์ง€ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

function createServer(requestListener?: RequestListener): Server;
type RequestListener = (req: IncomingMessage, res: ServerResponse) => void;
function readFile(path: PathLike | number, options: { encoding?: null; flag?: string; } | undefined | null, callback: (err: NodeJS.ErrnoException | null, data: Buffer) => void): void;

function readFile(path: PathLike | FileHandle, options?: { encoding?: null, flag?: string | number } | null): Promise<Buffer>;
  
type PathLike = string | Buffer | URL;

function join(...paths: string[]): string;

Express์˜ ํƒ€์ดํ•‘

export = e;
declare function e(): core.Express;
declare namespace e {
    var json: typeof bodyParser.json;
    var urlencoded: typeof bodyParser.urlencoded;
}
  
interface RequestHandler<
    P = core.ParamsDictionary,
    ResBody = any,
    ReqBody = any,
    ReqQuery = core.Query,
    Locals extends Record<string, any> = Record<string, any>
> extends core.RequestHandler<P, ResBody, ReqBody, ReqQuery, Locals> {}

import * as core from 'express-serve-static-core';

ํƒ€์ž… ํ™•์žฅ์„ ์œ„ํ•œ ์žฅ์น˜

// This extracts the core definitions from express to prevent a circular dependency between express and serve-static
declare global {
    namespace Express {
        // These open interfaces may be extended in an application-specific manner via declaration merging.
        // See for example method-override.d.ts (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/method-override/index.d.ts)
        interface Request {}
        interface Response {}
        interface Application {}
    }
}
  
export interface Request<
    P = ParamsDictionary,
    ResBody = any,
    ReqBody = any,
    ReqQuery = ParsedQs,
    Locals extends Record<string, any> = Record<string, any>
> extends http.IncomingMessage,
        Express.Request {}

import { ParsedQs } from 'qs';

export {};

export type Query = ParsedQs;

export interface ParamsDictionary {
    [key: string]: string;
}
export interface RequestHandler<
    P = ParamsDictionary,
    ResBody = any,
    ReqBody = any,
    ReqQuery = ParsedQs,
    Locals extends Record<string, any> = Record<string, any>
> {
    // tslint:disable-next-line callable-types (This is extended from and can't extend from a type alias in ts<2.2)
    (
        req: Request<P, ResBody, ReqBody, ReqQuery, Locals>,
        res: Response<ResBody, Locals>,
        next: NextFunction,
    ): void;
}
  
export interface NextFunction {
    (err?: any): void;
    /**
     * "Break-out" of a router by calling {next('router')};
     * @see {https://expressjs.com/en/guide/using-middleware.html#middleware.router}
     */
    (deferToNext: 'router'): void;
    /**
     * "Break-out" of a route by calling {next('route')};
     * @see {https://expressjs.com/en/guide/using-middleware.html#middleware.application}
     */
    (deferToNext: 'route'): void;
}

export interface Express extends Application {
    request: Request;
    response: Response;
}
  
export interface Application<
    Locals extends Record<string, any> = Record<string, any>
> extends EventEmitter, IRouter, Express.Application {
  use: ApplicationRequestHandler<this>;
}
  
export type ApplicationRequestHandler<T> = IRouterHandler<T> &
    IRouterMatcher<T> &
    ((...handlers: RequestHandlerParams[]) => T);
  
export type RequestHandlerParams<
    P = ParamsDictionary,
    ResBody = any,
    ReqBody = any,
    ReqQuery = ParsedQs,
    Locals extends Record<string, any> = Record<string, any>
> =
    | RequestHandler<P, ResBody, ReqBody, ReqQuery, Locals>
    | ErrorRequestHandler<P, ResBody, ReqBody, ReqQuery, Locals>
    | Array<RequestHandler<P> | ErrorRequestHandler<P>>;
  

passport ํƒ€์ดํ•‘

declare global {
    namespace Express {
        // tslint:disable-next-line:no-empty-interface
        interface AuthInfo {}
        // tslint:disable-next-line:no-empty-interface
        interface User {}

        interface Request {
            authInfo?: AuthInfo | undefined;
            user?: User | undefined;

            // These declarations are merged into express's Request type
            login(user: User, done: (err: any) => void): void;
            login(user: User, options: any, done: (err: any) => void): void;
            logIn(user: User, done: (err: any) => void): void;
            logIn(user: User, options: any, done: (err: any) => void): void;

            logout(options: { keepSessionInfo?: boolean }, done: (err: any) => void): void;
            logout(done: (err: any) => void): void;
            logOut(options: { keepSessionInfo?: boolean }, done: (err: any) => void): void;
            logOut(done: (err: any) => void): void;

            isAuthenticated(): this is AuthenticatedRequest;
            isUnauthenticated(): this is UnauthenticatedRequest;
        }

        interface AuthenticatedRequest extends Request {
            user: User;
        }

        interface UnauthenticatedRequest extends Request {
            user?: undefined;
        }
    }
}

passport-local ํƒ€์ดํ•‘

import { Strategy as PassportStrategy } from "passport-strategy";
import express = require("express");

interface IStrategyOptions {
    usernameField?: string | undefined;
    passwordField?: string | undefined;
    session?: boolean | undefined;
    passReqToCallback?: false | undefined;
}

interface IStrategyOptionsWithRequest {
    usernameField?: string | undefined;
    passwordField?: string | undefined;
    session?: boolean | undefined;
    passReqToCallback: true;
}

interface IVerifyOptions {
    message: string;
}

interface VerifyFunctionWithRequest {
    (
        req: express.Request,
        username: string,
        password: string,
        done: (error: any, user?: any, options?: IVerifyOptions) => void
    ): void;
}

interface VerifyFunction {
    (
        username: string,
        password: string,
        done: (error: any, user?: any, options?: IVerifyOptions) => void
    ): void;
}

declare class Strategy extends PassportStrategy {
    constructor(
        options: IStrategyOptionsWithRequest,
        verify: VerifyFunctionWithRequest
    );
    constructor(options: IStrategyOptions, verify: VerifyFunction);
    constructor(verify: VerifyFunction);

    name: string;
}

d.ts ์‚ฌ์šฉํ•˜๊ธฐ

  • ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ts ํŒŒ์ผ์— ํƒ€์ž… ์„ ์–ธํ•ด๋„ ๋จ
  • BUT, importํ•œ ๊ฒƒ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด ๊ฒน์น˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
  • ์ด๋Ÿด ๊ฒฝ์šฐ d.ts๋กœ ๋ถ„๋ฆฌ(d.ts๋Š” ํƒ€์ž…๋งŒ ์žˆ๊ณ  ๊ตฌํ˜„์€ ์—†๋Š” ํŒŒ์ผ)
  • ์šฐ์„  declare global, declare module, declare namespace ์—†์ด ํƒ€์ดํ•‘ํ•˜๊ธฐ
  • ํ™•์žฅํ•˜๊ณ  ์‹ถ์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ €๋ ‡๊ฒŒ ๋˜์–ด์žˆ๋‹ค๋ฉด declare ์ถ”๊ฐ€
  • ํ•œ ๋ฒˆ declare ์“ด ๋ธ”๋Ÿญ ์•ˆ์—์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ declare ํ•„์š” ์—†์Œ

์ง์ ‘ ํƒ€์ดํ•‘ํ•˜๊ธฐ

types/๋ชจ๋“ˆ๋ช….d.ts (๊ผญ types ํด๋” ์•ˆ์— ์žˆ์„ ํ•„์š”๋Š” ์—†์Œ)

declare module "๋ชจ๋“ˆ๋ช…" {
  // import๋‚˜ export ํ•˜๋‚˜ ํ•„์ˆ˜
}

More Repositories

1

nodejs-book

Node.js๊ต๊ณผ์„œ ์†Œ์Šค ์ฝ”๋“œ
JavaScript
807
star
2

react-nodebird

JavaScript
331
star
3

sleact

TypeScript
317
star
4

react-webgame

JavaScript
289
star
5

next-app-router-z

TypeScript
200
star
6

food-delivery-app

Objective-C
193
star
7

html-css-naver

HTML
184
star
8

es2021-webgame

HTML
105
star
9

webgame-lecture

JavaScript
104
star
10

nodejs-crawler

JavaScript
100
star
11

vue-webgame

Vue
61
star
12

vue-nodebird

JavaScript
51
star
13

ts-nodebird

HTML
42
star
14

ts-book

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ต๊ณผ์„œ ์†Œ์Šค ์ฝ”๋“œ
TypeScript
36
star
15

redux-vs-mobx

JavaScript
35
star
16

ts-react

TypeScript
35
star
17

react-filepicker

react component for filepicker
JavaScript
29
star
18

cs-database

28
star
19

cs-datastructure

์ž๋ฃŒ๊ตฌ์กฐ ๊ฐ•์ขŒ ์†Œ์Šค ์ฝ”๋“œ
JavaScript
26
star
20

react-vote

JavaScript
21
star
21

ts-lecture

TypeScript
21
star
22

z-com

TypeScript
20
star
23

cs-network-http

JavaScript
19
star
24

react-fb-like

React component for facebook like button!
JavaScript
17
star
25

react-nodebird-next13

TypeScript
17
star
26

nest-prisma

TypeScript
12
star
27

es2020-webgame

JavaScript
8
star
28

next.js

JavaScript
6
star
29

zerocho-sw

HTML
6
star
30

aws-upload

JavaScript
6
star
31

nodebird

JavaScript
5
star
32

es2024-webgame

HTML
5
star
33

whenwemeet

Application that graphically shows available time people can meet
JavaScript
5
star
34

nodejs-gcloud

Dockerfile
4
star
35

zplanner

offline webapp planner that syncs
JavaScript
4
star
36

google-image-crawler

JavaScript
4
star
37

naver-html-css-new

HTML
4
star
38

test-jest

HTML
3
star
39

design-pattern-canvas

3
star
40

kakao-sdk

Kakao javascript SDK packaged for Meteor
JavaScript
3
star
41

gitExample

HTML
3
star
42

kumovie

Java
3
star
43

node-window

JavaScript
3
star
44

free-git

2
star
45

food-delivery-app-69

Java
2
star
46

test

2
star
47

daum-maps-api

Daum Maps API async packaged for Meteor
JavaScript
2
star
48

html-css-naver-new

HTML
1
star