typescript 如何从其他属性推断类型

mmvthczy  于 2023-02-20  发布在  TypeScript
关注(0)|答案(2)|浏览(146)

我输入了一个基本的迁移工具--一个具有up()down()属性的对象。当提交迁移时,我保存了up()函数返回的数据,然后将其作为参数传递给down()函数,如下所示:

const myMigration: Migration<number[]> = {
  async up() {
    return [1, 2, 3];
  },
  async down(data) {
    data.forEach(number => console.log(number)); // 1, 2, 3
  },
};

到目前为止,我已经定义了迁移类型,如下所示:

type Migration<T = void> = {
  up(): Promise<T>
  down(data: T): Promise<void>
}

当前的问题是我必须显式地定义类型,但是我希望从等待的返回类型up()中推断出down()数据参数的类型。
以下是我的一些失败尝试:
一个二个一个一个
预期结果:

const myMigration: Migration = {
  async up() {
    return [1, 2, 3];
  },
  async down(data) {
    // yay, type of data is inferred
    data.forEach(number => console.log(number)); // 1, 2, 3
  },
};

TypeScriptPlayground

ezykj2lf

ezykj2lf1#

你可以使用一个可以推断类型的create函数,例如

type Migration<T> = {
    up(): Promise<T>
    down(
        data: Awaited<ReturnType<Migration<T>['up']>>
    ): Promise<void>
}

function createMigration<T>(mig: Migration<T>) {
    return mig;
}

const migration = createMigration({
    async up() {
        return [1, 2, 3]
    },
    async down(data) {
        data.forEach((num) => console.log(num));
    }
})

Playground示例

x4shl7ld

x4shl7ld2#

看起来唯一的方法就是使用带有泛型参数的工厂。下面是一个例子:

type Migration<T> = {
  up(): Promise<T>;
  down(data: T): Promise<void>
}

const createMigration = <T,>(config: Migration<T>) => config

const myMigration = createMigration({
  async up() {
    return [1,2,3]
  },
  async down(data) {
    // data is infered from the `up` method
  }
})

相关问题