[英]Infer interface type argument in TypeScript
我们有以下代码:
interface Action {
type: string;
}
interface ActionA extends Action {
type: 'A';
payload: number;
}
interface ActionB extends Action {
type: 'B';
payload: string;
}
interface Processor<T extends Action> {
action: T;
process: (action: T) => void;
}
// usage
const actionA: ActionA = { type: 'A', payload: 42 };
const processorA: Processor<ActionA> = {
action: actionA,
process(action) {
// ...
},
};
现在我认为在const processorA: Processor<ActionA> = ...
中指定类型参数ActionA
const processorA: Processor<ActionA> = ...
是多余的,因为它可以从action: ActionA
推断出来action: ActionA
。 不幸的是,如果我只写const processorA: Processor = ...
那么Typescript会报错const processorA: Processor = ...
是否可以改进接口以便推断Processor
类型参数?
高级版:
我还希望action
字段为T | '*'
类型 T | '*'
。 在那种情况下, process(action)
action
参数应该是Action
类型(或者在最坏的情况下只是any
)。 这是否可以与上述类型参数推断一起使用?
打字稿中没有办法推断变量类型的一部分。 对于变量推断是全部或全部,您可以让编译器推断它,也可以在类型注释中指定它。
您可以使用函数来推断操作的类型:
function createProcessor<T extends Action>(p: Processor<T>) {
return p
}
const processorA = createProcessor({
action: actionA,
process(action) {
// ...
},
});
或者你可以使用IIFE作为一种奇特的类型断言:
const processorA = (<T extends Action>(p: Processor<T>) => p)({
action: actionA,
process(action) {
// ...
},
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.