繁体   English   中英

让TypeScript推断(部分或全部)通用参数

[英]Let TypeScript infer (some or all) generic parameter

假设我有一个通用类型Gen<T>

type Gen<T> = {
    t: T,
    x: boolean,
};

然后,我有一些函数带有Gen但并不关心T类型:

function handleGen1(gen) {
    if (gen.x) {
        return gen;
    }
}

我将如何输入handleGen1 目前,我只能以这种方式看到:

function handleGen1<T>(gen: Gen<T>) {
    if (gen.x) {
        return gen;
    }
}

是否有一种更简洁的方法,例如在Flow中function handleGen1(gen: Gen<*>) { ... } )?

另外,如果我的函数仅取决于某些类型参数怎么办?

type Gen<P, E> = {
  p: P,
  e: E,
  x: boolean,
}

function handleGen2(gen) {
    if (gen.x) {
        return gen.p;
    }
}

我想输入为:

handleGen2: (gen: Gen<P, *>) => P;

在打字稿中没有与*语法等效的内容。 通过声明type参数发现的选项是一个不错的选择。 请注意,在呼叫站点不必指定额外的参数,打字稿将推断出适当的T

type Gen<T> = {
    t: T,
    x: boolean,
};

function handleGen1<T>(gen: Gen<T>) {
    if (gen.x) {
        return gen;
    }
}

handleGen1({
    t: 1,
    x: true
}) // T infered as number

如果您对Gen有更多参数,则将为每个类型参数声明一个:

type Gen<T, P> = {
    t: T,
    p: P,
    x: boolean,
};

function handleGen1<T, P>(gen: Gen<T, P>) {
    if (gen.x) {
        return gen;
    }
}

handleGen1({
    t: 1,
    p: "",
    x: true
}) // T inferred as number, P number

现在,如果您确实不在其他任何位置使用type参数,则可以使用Gen<any>Gen<unknown> 在您的示例中,由于返回类型将为Gen<T>因此您确实使用T ,因此Gen<any>将不会转发类型参数。 如果不是这种情况,我们可以使用以下选项:

type Gen<T> = {
    t: T,
    x: boolean,
};

function handleGen1(gen: Gen<unknown>) {
    if (gen.x) {
        console.log(gen.t);
    }
}

handleGen1({
    t: 1,
    x: true
}) // works fine 1 is assignable to unknown 

必须指定类型参数的缺点是也必须指定类型约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM