【问题标题】:How to "bound" to parameters in TypeScript, making one type "depend" on other type?如何“绑定”到 TypeScript 中的参数,使一种类型“依赖”另一种类型?
【发布时间】:2019-02-08 00:02:20
【问题描述】:

让我解释一下:

  • arg1 必须是 Type1Type2
  • arg2 必须是 Type1.options(如果 arg1Type1)或 Type2.options 否则
create(arg1: Type1 | Type2, arg2?: any) {}

可以在 TypeScript 中定义这个“绑定”吗?

【问题讨论】:

    标签: typescript types parameters type-inference


    【解决方案1】:

    您正在寻找overloaded function

    function create(arg1: Type1, arg2?: Type1.options);
    function create(arg1: Type2, arg2?: Type2.options);
    function create(arg1: Type1 | Type2, arg2?: Type1.options | Type2.options) { ... }
    

    请注意,最后一个签名(“实现签名”)不是重载签名之一,并且应该足够广泛以涵盖所有重载签名。您将在函数体中整理出实际参数。

    【讨论】:

    • 哇。这很酷......而且很冗长:) 所以我需要定义 arg1 和 arg2 的每个组合......最后,让所有这些组合成为“联合”?
    • 是的,除非您想真正了解条件类型以根据第一个参数查找第二个参数的正确类型。
    【解决方案2】:

    您可以使用generic 声明来推断依赖关系,如下所示:

    function create<T extends (Type1 | Type2)> (arg1: T, arg2?: T['options']) { ... }
    

    您还可以创建一个类似type ArgType = Type1 | Type2 的别名来简化通用约束:

    function create<T extends ArgType> (arg1: T, arg2?: T['options']) { ... }
    

    【讨论】:

    • 如果 T.options 并不总是“T.options”,而是作为 TOptions 提供(比如说)怎么办?
    • 如果它们是独立的类型,您需要详细说明它们之间的关系。这不是同一个问题。
    • 即使原始类型设置为T.options,我认为这个解决方案不会像写的那样工作,因为类型参数只传递T的类型含义,而不是命名空间含义.必须做一些事情,比如使options 成为T 类型的实际属性(一个可选属性,以免干扰T 的正常使用),然后使用T["options"],或者做一些花哨的事情条件类型。
    猜你喜欢
    • 2020-08-21
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2021-09-07
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多