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>