【问题标题】:Typescript String Literal Type in generic function通用函数中的打字稿字符串文字类型
【发布时间】:2020-04-11 16:32:05
【问题描述】:

我有一个带有一个泛型参数的函数,但有两个函数参数。 当我使用“字符串文字类型”时,两个函数参数可以有不同的值:

function func2<T extends 'A' | 'B'>(x: T, y: T): void { }

func2('A', 'A'); // OK
func2('A', 'B'); // OK, why?
func2('A', 'C'); // ERR

但我需要 xy 相同,例如 Classes 示例:

class A {  public a;}
class B {  public b;}
class C {  public c;}

function func1<T extends A | B>(x: T, y: T): void { }

func1(new A(), new A()); // OK
func1(new A(), new B()); // ERR
func1(new A(), new C()); // ERR

xy 有没有与“字符串文字类型”相同的值?

【问题讨论】:

  • 参数都与约束匹配,并且顺序无关紧要,因此会进行适当的推断,但是您可以写func2&lt;T extends 'A' | 'B', U extends T&gt;(x: T, y: U)。这使得第二个约束取决于第一个
  • 感谢 Aluan Haddad 解决了我的问题。我是 Stackoverflow 的新手,如何将您的答案标记为解决方案?
  • 哦,这不是答案,而是评论。我稍后会添加答案

标签: typescript generics


【解决方案1】:

Aluan Haddad 的评论解决了问题:

参数都匹配约束,并且顺序无关紧要,因此会进行适当的推理,但是您可以编写 func2(x: T, y: U)。这使得第二个约束取决于第一个

现在两个参数只能有相同的值:

function func2<T extends 'A' | 'B', U extends T>(x: T, y: U): void { }

func2('A', 'A'); // OK
func2('A', 'B'); // ERR
func2('A', 'C'); // ERR

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2021-07-17
    • 2018-04-28
    • 2023-02-03
    • 2020-06-12
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多