gpt4 book ai didi

typescript - 让 TypeScript 推断(部分或全部)泛型参数

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:43 25 4
gpt4 key购买 nike

假设我有一个通用类型 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;

最佳答案

没有等价于 * 的东西 typescript 中的语法。您通过声明类型参数找到的选项是一个很好的选项。请注意,在调用站点不必指定额外参数, typescript 将推断出适当的 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

现在如果你真的不在任何其他位置使用类型参数,你可以使用 Gen<any>Gen<unknown> .在您的示例中,您确实使用了 T因为返回类型将是 Gen<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

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

关于typescript - 让 TypeScript 推断(部分或全部)泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53849591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com