繁体   English   中英

在TypeScript中推断接口类型参数

[英]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.

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