【发布时间】:2020-03-22 02:54:53
【问题描述】:
我有一个有 2 个参数的方法,我希望它从第一个参数推断出一个类型。
例如,在下面的代码中,我希望从firstArgument 中推断出函数create_C<T> 的类型T,以便create_C 函数的返回类型为C<type inferred from firstArgument>
interface C<T> {
firstArgument: A<T>;
secondArgument: (obj: any) => T
}
export interface A<T> {
type: T;
}
function create_C<T>(
firstArgument: A<T>,
secondArgument: (obj: any) => T
): C<T> {
return {
firstArgument,
secondArgument
}
}
但是,在下面的实现中,const c 的类型被推断为C<{ prop2: number }>。但我希望它被推断为C<B>,并且我希望编译器会抛出一个错误,指出secondArgument 的返回类型不是B 类型
interface B {
prop1: string;
prop2: number
}
export class B_Component implements A<B> {
type: B = {
prop1: "",
prop2: 1
};
}
const c = create_C(
new B_Component(),
() => ({ prop2: 2 })
)
如何确保编译器抛出错误,指出 secondArgument 的返回类型不是 B 类型?
这里是 Stackblitz 编辑器链接:https://stackblitz.com/edit/qqddsn
【问题讨论】:
-
不完全关注但你不应该像这样打电话给
create_C吗?:create_C<B_Component>()。您使用泛型键入函数,一切看起来都不错,只需在调用时将正确的类型传递给 T... -
那么您是否希望您的
create_C调用出错?作为第二个参数传递的回调不返回B,它返回{prop2: number},所以c是C<{prop2: number}>。为什么不在回调中返回一个实际的B? -
@MrRobboto 我不想用泛型调用函数。我希望根据传递的第一个参数的类型推断泛型
-
很确定您不应该将 create_C 键入为采用泛型 then
-
并且应该读入 @jcalz 评论 -
() => ({ prop2: 2 })不适合您使用secondArgument: (obj: any) => T键入的内容
标签: typescript typescript-generics