【问题标题】:TypeScript Generics with interface parameters带有接口参数的 TypeScript 泛型
【发布时间】:2022-12-18 18:37:21
【问题描述】:

我在玩 TypeScript 泛型,有点困惑。

我基本上是在尝试创建一个接口,该接口具有可以接收任意选项参数的方法。这个参数可以是任何对象。确切的对象是什么样子是由实现类决定的。

interface MyOptions {
    foo: string
}

interface TestInterface {
    doSome<T extends Record<string, unknown>>(value: T): void
}

class TestClass implements TestInterface {
    doSome<T = MyOptions>(value: T): void {
        value.foo // complains that foo doesn't exist
    }
}

一切看起来都很好,但是当我尝试访问 value.foo 时,似乎没有键入 value

难道我做错了什么?

更新

我发现了一些关于未扩展 Record&lt;string, unknown&gt; 的接口的有用信息,说使用 type 代替(参见 interface object couldn't extends Record<string, unknown>)。

但是,如下所示更新上面的 sn-p 后,问题仍然存在。

type MyOptions = {
    foo: string
}

interface TestInterface {
    doSome<T extends Record<string, unknown>>(value: T): void
}

class TestClass implements TestInterface {
    doSome<T = MyOptions>(value: T): void {
        value.foo // complains that foo doesn't exist
    }
}

【问题讨论】:

  • this approach 是否满足您的需求?如果是这样,我可以写一个答案来解释;如果没有,我错过了什么?
  • 这种方法可行,但我正在处理的实际接口将有多种方法接收不同类型的参数。这可以像this 那样解决,但不是那么明确。
  • 我不确定我想要的是否可行。也许这种方法确实是可行的方法;)
  • 不,那只是一个default
  • 当我有机会时,我会写一个答案。

标签: typescript generics


【解决方案1】:

您不能以这种方式重载函数。如果您尝试为此创建联合,则可以使用以下代码示例:

type MyOptions = Record<string, unknown> & { foo: string };

interface TestInterface {
  doSome<T extends MyOptions>(value: T): void;
}

class TestClass implements TestInterface {
  doSome<T extends MyOptions>(value: T): void {
    console.log(value.foo);
  }
}

const test = new TestClass();

test.doSome({ foo: "bar", baz: "qux" });

/*
*  The combined type of the two objects is:
* TestClass.doSome<{
    foo: string;
    baz: string;
}>(     value: {foo: string, baz: string}): void
* 
* */

超载注意事项的有用链接 link

【讨论】:

  • 感谢您的回答,但我不是在寻找联合类型。我可能以错误的方式表达了我的问题。请参阅我的问题下方的 cmets。
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 2018-09-15
  • 1970-01-01
  • 2021-02-14
  • 2021-07-04
  • 1970-01-01
  • 2021-09-16
  • 2018-04-09
相关资源
最近更新 更多