Skip to content

Instantly share code, notes, and snippets.

@1natsu172
Last active June 18, 2020 15:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1natsu172/26eb59adf3405435e0d99d71cdb70ea0 to your computer and use it in GitHub Desktop.
Save 1natsu172/26eb59adf3405435e0d99d71cdb70ea0 to your computer and use it in GitHub Desktop.
TypeScriptでNonNullableなPromise型をやる
/*
* PlayGroundはこれ
* https://www.typescriptlang.org/play/index.html#code/PTAEAUCcHsFsEsDOBTAPAOwK6wEbMqAD6iboAmyAZvOsmQHygC8jUcSaWu+jg1gyDqDIH0GQCIMAWABQEkKEBSDIFUGQJEMY8QBcAngAdkoAHKZSzUFzwFipCtVpkJ6rbujo9AGyc6AjIZ0PnTgIY4nND1SegkpMDYEFEBo9UA7BkAi1MAHU0AkhkATBkB5BkBohgkAYwdEFVBKaGhDX0Q1dBzQAAp0AC4jbBMASmZGdFBGNwAGUAB+I1BG8yoaOjDxaQAlZBVMSHQAFU1kQHMGQBX4wCiGQBIFWOjkwCaGQGGGQAmGG1XQWZUAMRLDa4Xl1dRbZGhKIpLQySmwL0cmBcgA0GQDBDIArBmEgDICC52AE+a53UpMeyAlz+QKoRHfSYzOZPFZafiAMwZhJlANIMCkA+P9vD4ksmUqntUCAAl9ACzmvEAIQyAYwZiYB-Bmyqku4GCnRRkQ4GGa+CIJHIYysP2kgEhNQDxDLzITChXZwJ5vEC-AE0CL9OgfuFQAALFQqDSIeogADm8BUlswOAAdHlYMBEDQyJBkIhoJA3YhgG8ALSUIMqWHaCUoABqvicmGNMCiyEJyAANKAAPKu-AAdw4hkT2dWjHFmY4OdAyAAHipkOREBA6yhUDQYwQU2nkIxBgP08NC8XIGWUABueOgACCFSqN1IORU8AchhqHt3vkgjvtoF86DUAG0ALptFid9jd0gAa3Q0BLZrn2u0S8qOUeixzqCWfdHTmRsWzbMgOy-Fc1w3Bwa1vLNRzQX9ni0ACgLmeh6HfC1K1ibZohOU41kAWQZiUAAHNAA2s+cAGVfHgB9oEwCsu2QJDUBNEILRQnNYkrQAJJ2ZPCCKI0iKOoj9QDohimIAJkMKCf3xP8XlpT5imgJUIlY-CtgOeEDV4MSqNo+jGMwABmPU0UNTFpPM2TzT+UBhEACQZAB+GZQ3gQjg9G4AhazvNB7KYiynOkQB7hkAZ4ZAEuGQAShkAKYZ3NAQBeDcAcD35wLWBfG0QKs1QAz0SNVBFJ41TVg+L5NKwoA
*/
// Promise<number | undefined> => Promise<number> にしたい
// おさらい
type Nuun = number | undefined
type NonNullN1 = NonNullable<Nuun>
// Promise型の関数をつくる
const foo = async (n: number) => n > 10 ? n : undefined
// ReturnTypeで返り値の型をゲット
type RetFoo = ReturnType<typeof foo>
// NonNullじゃない…
type NonNullRetFoo = NonNullable<RetFoo>
// ReturnTypeしているから?typeofしているから? => 素朴にやってみる
type PNuun = Promise<number | undefined>
// 変わってない…
type P = NonNullable<PNuun>
// https://github.com/sindresorhus/type-fest にある便利型を拝借
type PromiseValue<PromiseType, Otherwise = PromiseType> = PromiseType extends Promise<infer Value> ? Value : Otherwise;
type AsyncFunction = (...args: any[]) => Promise<unknown>;
type AsyncReturnType<Target extends AsyncFunction> = PromiseValue<ReturnType<Target>>;
// Promiseの返り型ゲットできて最高
type Saikou = PromiseValue<PNuun>
// ReturnTypeのPromise版 => Promiseの返り型ゲットできて最高
type Saikou2 = AsyncReturnType<typeof foo>
// Promiseの返り型をNonNullにできて最高
type Saikou3 = NonNullable<Saikou2>
// いえーい
type PromiseNumber = Promise<Saikou3>
// ワンライナー 😇
type Omae = Promise<NonNullable<AsyncReturnType<typeof foo>>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment