【问题标题】:TypeScript generic method with type dependent parameter具有类型相关参数的 TypeScript 泛型方法
【发布时间】:2018-04-12 19:55:47
【问题描述】:

我有一个想法,有一个代码可以根据方法的泛型类型自动检查参数的类型。但是参数的类型应该与给定泛型类型的具体属性的类型相同。让我给你举个例子。

假设我有这些接口:

interface IMessage {
    name: string,
    payload: any
}

interface IConcreteMessage {
    name: "concreteMessage",
    payload: string
}

我想以这种方式将一些方法接受 IMessage 称为通用参数:

someobject.genericMethod<IConcreteMessage>(78)

现在的问题是,应该如何声明该方法,以便编译器为给定参数抛出类型错误?

public genericMethod<T extends IMessage>(payload: ??) {}

第二件事 - 我可以以某种方式仅从给定的通用参数中提取方法中的“concreteMessage”值吗?

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    您可以使用类型查询来实现此目的:

    genericMethod<T extends IMessage>(payload: T['payload']) { }
    
    someobject.genericMethod<IConcreteMessage>(78) // will be an error
    

    您可以在运行时从文字字符串类型获取字符串,您需要将字符串值作为参数传递。

    【讨论】:

    • 我试过了,但由于某种原因它以前不起作用,但现在它是....无论如何谢谢。那么第二个问题呢 - 访问“名称”值而不直接传递它?这甚至可能吗?
    • @mikeek 这是不可能的,将其添加到答案中
    • 好吧,我想的越多,我对这种方法的感觉就越糟糕......非常感谢:)
    • @mikeek 实际上这是一种非常常见的方法....您无法获取字符串,但您可以限制调用者只能将特定字符串传递给您
    【解决方案2】:

    好的,所以我最终得到了这个解决方案:

    genericMethod<T extends IMessage>(name: T['name'], payload: T['payload']) { }
    

    缺点是我需要在每次调用时输入第一个参数,即使这个属性是恒定的,但我认为我可以忍受

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      相关资源
      最近更新 更多