作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有一个通用类型 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/
我是一名优秀的程序员,十分优秀!