Выберите выведенный тип из развернутого типа Promise в машинописи - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть функция getStaticProps (следующая js), которая возвращает Обещание, преобразуя его в Объект со следующей подписью:

type StaticProps<P> = {
    props: P;
    revalidate?: number | boolean;
}

Я могу "развернуть" тип возвращаемого объекта обычно через:

type UnwrappedPromiseType <T extends (...args: any) => any> =
    T extends (...args: any) => Promise<infer U> ? U :
        T extends (...args: any) => infer U ? U : any

Из этого разрешенного типа мне нужен только предполагаемый тип {props: {}}! Как я могу Pick тип для {props: {}} из возвращенного типа?

полный пример:

import { PrismaClient, Post } from "@prisma/client";
import Link from "next/link";
const prisma = new PrismaClient();

// ts correctly infers this to:
// () => Promise<{props: {posts: Array<Post>}}>
export const getStaticProps = async () => ({
  props: {
    posts: await prisma.post.findMany(),
  },
});

// i want to automatically infer the type for my props object 
const Posts = ({ posts = [] }: {posts: Post[]}) => (
  <main>
    <h1>Posts:</h1>
    <ul>
      {posts.map((post) => (
        <li key={post.id}>
          <Link href={`/posts/${post.id}`}>
            <a>{post.title}</a>
          </Link>
        </li>
      ))}
    </ul>
  </main>
);

export default Posts;

1 Ответ

0 голосов
/ 11 апреля 2020

Вам не нужны Pick, но типы индекса

type PostProps = UnwrappedPromiseType<typeof getStaticProps>["props"];

const Posts = ({ posts = [] }: PostProps) => ( ... );
...