notes

#typescript

isReactElement2021. 3. 19.

const isReactElement = (element: ReactNode): element is ReactElement =>
  element !== null && typeof element === 'object' && 'props' in element;
const isReactElement = (element: ReactNode): element is ReactElement =>
  element !== null && typeof element === 'object' && 'props' in element;

as const2021. 1. 21.

type predicate2021. 1. 11.

interface Article {
   title: string;
   body: string;
}

function isArticle(body: unknown): body is Article {
  let b = body as Article;
  return !!b && typeof b.body === 'string' && typeof b.title === 'string';
}
interface Article {
   title: string;
   body: string;
}

function isArticle(body: unknown): body is Article {
  let b = body as Article;
  return !!b && typeof b.body === 'string' && typeof b.title === 'string';
}

Promise.allSettled2020. 10. 23.

모든 promise가 resolve/reject 되기를 기다렸다가 각 promise의 result를 반환한다.

Promise.all과 다른점

  1. promise 중 reject가 있어도 일단 모두 pending 상태를 벗어나길 기다렸다가 결과값을 반환한다.
  2. reject를 따로 하지 않고 반환값을 변경하므로 catch를 타지 않는다.
  3. 대신 반환 결과값이 보통의 promise와 다르다. Promise<T>가 아니고 PromiseSettledResult<T>를 반환.
  4. PromiseSettledResult는 아래와 같이 생겼다.
// fullfiled
{
  status: "fullfiled",
  value: T
}

// rejected
{
  status: "rejected",
  reason: any
}
// fullfiled
{
  status: "fullfiled",
  value: T
}

// rejected
{
  status: "rejected",
  reason: any
}

실제로 돌려보면 아래와 같다.

Screen Shot 2020-10-23 at 12 04 57 PM Playground

Ref

Promise.allSettled

Unexpected use of 'isNaN'. (eslintno-restricted-globals), Argument of type 'string' is not assignable to parameter of type 'number'. ts(2345)2020. 8. 12.

let val = '123'

isNaN(val) // nah! Argument of type 'string' is not assignable to parameter of type 'number'. ts(2345)
isNaN(123) // nah! Unexpected use of 'isNaN'. (eslintno-restricted-globals)
let val = '123'

isNaN(val) // nah! Argument of type 'string' is not assignable to parameter of type 'number'. ts(2345)
isNaN(123) // nah! Unexpected use of 'isNaN'. (eslintno-restricted-globals)

then use

Number.isNaN(val) // yay!
Number.isNaN(val) // yay!

Declaring Global Variables in TypeScript2020. 7. 31.

daum 주소검색등 window에 뭔가 끼워넣는 외부 기능 사용시, window.someApi등으로 호출하게 될 때가 있는데, TS에서 당연히 Property 'someApi' does not exist on type 'Window & typeof globalThis'. 라고 뭐라고 한다. 요걸 해결하기 위해 보통은:

(window as any).someApi
(window as any).someApi

혹은

(<any>window).someApi
(<any>window).someApi

를 쓰라고 하는데 아래가 더 나은 것 같다.

declare global {
  interface Window {
    someApi: any; // 혹시 타입 정의를 제공해준다면 somApiType
  }
}
declare global {
  interface Window {
    someApi: any; // 혹시 타입 정의를 제공해준다면 somApiType
  }
}

요게 되는 것은 interface는 merging이 되기 때문.

Ref.

https://mariusschulz.com/blog/declaring-global-variables-in-typescript

type argument default value2020. 7. 22.

예를 들어, 첫번째 arg는 보통 string이고 두번째 arg는 보통 number인데 아닐 수도 있고 두번째 arg가 있을 수도 없을 수도 있는 함수의 타입을 정의한다면 아래와 같이 선언할 수 있을 것이다.

type ExampleFn<T, U> = (arg0: T, arg1?: U) => SomeReturnType;
type ExampleFn<T, U> = (arg0: T, arg1?: U) => SomeReturnType;

근데 쓸 때 마다 아래와 같이 하기는 매우 귀찮은 일이다.

const implmentedFn1: ExampleFn<string, number> = (val: string) => /* ... */
const implmentedFn1: ExampleFn<string, number> = (val: string) => /* ... */

그래서 ts는 type argument에도 default value를 정해놓을 수 있는데, 함수 default value랑 동일한 형태로, 아래와 같이 하면 된다.

type ExampleFn<T = string, U = number> = (arg0: T, arg1?: U) => SomeReturnType;
type ExampleFn<T = string, U = number> = (arg0: T, arg1?: U) => SomeReturnType;

이제부턴 굳이 명시할 필요가 생기지 않으면 그냥 편하게 쓸 수 있다.

const implmentedFn2: ExampleFn = (val: string) => /* ... */
const implmentedFn2: ExampleFn = (val: string) => /* ... */

그러고보니 아예 arg에 타입 어노테이션을 안해도 된다.

const implmentedFn3: ExampleFn = (val) => /* ... */
const implmentedFn3: ExampleFn = (val) => /* ... */

Tags