Engineering from Scratch

エンジニア目指してます

2022/07/19

mapped type

  • readonly型をつけることで,書き換え不可能なものであるというインターフェースだとわかる
const convertToNumberAll = (strArray: readonly string[]): number[] => {
  return strArray.map((str) => parseInt(str, 10));
};

const array = ["1", "2"] as const;

const intArray = convertToNumberAll(array);
  • mapped type
const convertToNumberAll = <A extends readonly string[]>(
  strArray: A
): { [K in keyof A]: number } => {
  return strArray.map((str) => parseInt(str, 10)) as any;
};

const array = ["1", "2"] as const;

const intArray = convertToNumberAll(array);

素数が引数と返り値で同じだと型からわかる

conditional type

type Options<IsOptional extends boolean> = { optional: IsOptional };
const getUserInput = async <IsOptional extends boolean>({
  optional,
}: Options<IsOptional>): Promise<
  IsOptional extends false ? string : string | undefined
> => {
  while (true) {
    const result = await fetch("/");
    if (result !== undefined || !optional) {
      return result.json();
    }
  }
};

const foo = getUserInput({ optional: false }); => Promise<string>
const bar = getUserInput({ optional: true }); => Promise<string | undefined>

参考

https://blog.uhy.ooo/entry/2020-08-31/dont-fear-ts/