【问题标题】:typescript generics assign empty object打字稿泛型分配空对象
【发布时间】:2016-10-25 20:42:01
【问题描述】:

这就是我想要实现的目标:

interface IFoo { ... }
function extendWithFoo<T extends {}>(x: T = {}): T & IFoo {
 ...
}

我收到错误 TS2322:类型“{}”不可分配给类型“T”。

有没有办法做到这一点?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    你可以这样做:

    function extendWithFoo<T extends {}>(x: T = {} as T): T & IFoo {
        ...
    }
    

    但是使用空对象是有问题的,因为它接受所有内容:

    extendWithFoo(3); // ok
    extendWithFoo("string"); // ok
    extendWithFoo(true); // ok
    extendWithFoo({}); // ok
    extendWithFoo({ key: "value" }); // ok
    extendWithFoo(new Array()); // ok
    

    所以我的建议是使用更具体的东西。
    无论如何,您并不需要它,您可以:

    function extendWithFoo<T>(x: T = {} as T): T & IFoo {
        ...
    }
    

    这给了你同样的东西。

    【讨论】:

      【解决方案2】:

      除了 Nitzan Tomer 的建议之外,您还可以引入一种类型以将输入限制为仅限对象字面量

      type ObjectLiteral = { [key: string]: any };
      
      interface IFoo {
          resultHasFoo(): void; 
      }
      
      function extendWithFoo<T extends ObjectLiteral>(x: T = {} as T): T & IFoo {
          return x as T & IFoo;
      }
      
      extendWithFoo(false); // error!
      
      extendWithFoo(123); // error!
      
      var p = extendWithFoo({
          test: "one"
      });
      
      p.resultHasFoo(); // works!
      

      看看我的相关帖子...JavaScript to TypeScript: Intellisense and dynamic members

      【讨论】:

        猜你喜欢
        • 2019-06-08
        • 2019-01-16
        • 2020-10-11
        • 2020-01-08
        • 2018-05-06
        • 2017-09-16
        • 2020-05-25
        • 2015-11-27
        • 2021-12-06
        相关资源
        最近更新 更多