【问题标题】:How to infer a method return type from an enum input with Typescript?如何使用 Typescript 从枚举输入中推断方法返回类型?
【发布时间】:2019-07-14 17:27:13
【问题描述】:

我有一个 AudioProcessor 枚举:

export enum AudioProcessors {
  BiquadFilter = 'BiquadFilter',
  StereoPanner = 'StereoPanner',
  DynamicsCompressor = 'Dynamics​Compressor​',
  None = 'None'
}

还有一个 AudioProcessorNode 类型:

export type AudioProcessorNode = BiquadFilterNode | StereoPannerNode | DynamicsCompressorNode;

我想创建一个类方法,它接受枚举并返回对应的节点(来自某些类属性),但我不确定如何让 Typescript 推断类型以便:

public getProcessor(audioProcessor: AudioProcessors): AudioProcessorNode {        
   throw new Error(`Method not implemented. ${audioProcessor}`);
}

audioClass.getProcessor(AudioProcessors.BiquadFilter) // returns BiquadFilterNode 

看起来我需要像ReturnType 这样的东西,但我不知道如何将它放在我的方法签名中。

【问题讨论】:

  • 问题是返回type还是返回value
  • 嗨@T.J.Crowder 是关于返回type

标签: typescript


【解决方案1】:

您可以使用重载使方法返回适当的类型:

public getProcessor(audioProcessor: AudioProcessors.BiquadFilter): BiquadFilterNode 
public getProcessor(audioProcessor: AudioProcessors.DynamicsCompressor): DynamicsCompressorNode
public getProcessor(audioProcessor: AudioProcessors.StereoPanner): StereoPannerNode 
public getProcessor(audioProcessor: AudioProcessors): AudioProcessorNode {        
    throw new Error(`Method not implemented. ${audioProcessor}`);
}

或者您可以使用从枚举成员到适当返回类型的映射接口:

interface AudioProcessorNodeMap {
    [AudioProcessors.BiquadFilter] : BiquadFilterNode;
    [AudioProcessors.DynamicsCompressor] : DynamicsCompressorNode;
    [AudioProcessors.StereoPanner] : StereoPannerNode;
    [AudioProcessors.None] : void;
}

class x{

    public getProcessor<T extends AudioProcessors>(audioProcessor: T): AudioProcessorNodeMap[T]
    public getProcessor(audioProcessor: AudioProcessors): AudioProcessorNode {        
        throw new Error(`Method not implemented. ${audioProcessor}`);
    }
}


此版本的优点是如果您忘记在接口中添加成员,您将收到方法错误。

【讨论】:

  • 这也是我能想到的唯一答案,但遗憾的是,OP 希望它由枚举驱动——例如,向枚举添加另一个条目会自动反映在 getProcessor 中。 (我应该留下我的评论问他们。)
  • @T.J.Crowder 是的。这是最接近的。如果您在枚举中添加成员但不是在地图中添加成员,则地图版本的好处是您会收到错误
  • 是的,地图版看起来很不错。是的,这是两个地方而不是一个地方,但是......
  • 谢谢@TitianCernicova-Dragomir 我将使用地图版本。不在地图中的键的错误很有帮助。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2021-08-05
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多