【问题标题】:Override only some of the generic variables仅覆盖一些通用变量
【发布时间】:2021-12-08 03:01:54
【问题描述】:

考虑以下场景:

class Test<A extends myObjectType = myObjectType, B extends myOtherObjectType = myOtherObjectType> {};

const TestValue: Test<myObjectType, myChangedObjectType> = ...

是否有可能只覆盖一些具有默认值的泛型变量?

我想要达到的,是做这样的事情的能力:

class SecondTest extends <_, myChangedObjectType> { ... }

我想让 Typescript 知道,通过省略第一个泛型参数(通过向其提供默认值,例如 _),我指的是原始类的默认值。

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    正如@T.J.Crowder 所说,没有办法改变或覆盖泛型参数。

    但是有一个解决方法。您可以创建从先前类型继承第一个参数的新类型并添加新的泛型类型

    type myObjectType = {
      tag: 'myObjectType'
    }
    type myOtherObjectType = {
      tag: 'myOtherObjectType'
    }
    
    class Test<A extends myObjectType = myObjectType, B extends myOtherObjectType = myOtherObjectType> { };
    
    
    type Change<
      Class extends Test<any, any>,
      NewType extends myOtherObjectType> =
      (Class extends Test<infer Type, infer _>
        ? (Type extends myObjectType
          ? Test<Type, NewType>
          : never)
        : never)
    
    type Changed = Change<Test<myObjectType, myOtherObjectType>, myOtherObjectType & { greet: 'hello' }>;
    
    declare var changed: Changed;
    

    Playground

    您只能推断第一个泛型类型,并使用第一个泛型类型和新的第二个泛型类型构造新类型。

    【讨论】:

    • @T.J.Crowder 谢谢,更新了
    • 哦,这意味着这不能解决我的问题:(用一个例子更新了我的问题
    【解决方案2】:

    如果您未指定先前的类型参数,则不能指定 later 类型参数。这是2.3 docs on type parameter defaults 的链接,但我认为它没有改变(v.4.4.4 游乐场不允许我这样做)。

    因此,您可以在示例中省略第二个类型参数 (Test&lt;something&gt;),或两者都省略 (Test),但您不能在指定第二个参数时只省略第一个参数 (Test&lt;/*nothing here*/, something&gt; )。

    【讨论】:

    • 你的回答比较正确,好像是OP想改变创建的类型
    • @captain-yossarian - 谢谢。我以为他们只是想定义(基本上)const TestValue = Test&lt;, myChangedObjectType&gt;,但我认为您对问题的理解不同。希望OP会澄清,因为老实说,我不知道我是否读对了。 :-)
    • @AdamBaranyai - 首先放置必需的,然后是可选的。但不幸的是,如果你有(例如)interface Example&lt;A, B, C = DefaultC, D = DefaultD&gt; 并且你想在使用它时指定一个不同的 D,你必须明确指定 DefaultC。 (这在允许默认值的情况下相当常见,JavaScript 的默认参数值允许您说 undefined 以获取默认值是非常不典型的。)我认为没有办法解决这个问题,但 Captain-yossarian 是比我更擅长 TypeScript,所以……我不得不承认我不明白他的回答。 :-D
    • @T.J.Crowder 你是对的,没有wild card
    • @captain-yossarian - 是的,这就是我在上面所说的 JavaScript 对默认参数值的略微非典型(但很有用!)的方法。如果你有function example(a = 1, b = 2, c = 3) { return a + b + c; },那么example() 和example(undefined, undefined, undefined)`都使用默认值并返回6。
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2019-07-23
    • 2011-09-30
    • 1970-01-01
    • 2021-11-28
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多