【问题标题】:Keying a generic type using a Symbol in Typescript?使用 Typescript 中的符号键入泛型类型?
【发布时间】:2019-02-03 10:48:55
【问题描述】:

我正在尝试做这样的事情:

function attachUUID<T>(o:T) {
   o[Symbol('id')]=v1();
}

T 泛型类型是一个类定义或一些定义的 Typescript type。 VSCode 错误是:

 [ts] Element implicitly has an 'any' type because type '{}' has no index signature

【问题讨论】:

    标签: javascript typescript metaprogramming symbols


    【解决方案1】:

    您的代码不保证您使用的符号命名属性已在T 上声明。您可以将T 约束为声明属性的类型:

    const symbolId = Symbol('id');
    function attachUUID<T extends { [symbolId]: string }>(o: T) {
       o[symbolId]=v1();
    }
    

    或者投到any:

    function attachUUID<T>(o: T) {
       (<any>o)[symbolId]=v1();
    }
    

    【讨论】:

      【解决方案2】:

      ...或者如果您想将符号分配给任何对象:

       const idSym = Symbol('id');
      
       function attachUUID<T>(o:T) {
          type withUUID = T & { [idSym]: string };
          (o as withUUID)[idSym] = v1();
          return o as withUUID;
       }
      

      这样你就可以在之后获得类型安全:

       const el = attachUUID({ a: 1 });
       console.log(el.a, el[idSym]);
      

      【讨论】:

      • 这太棒了 - 只是好奇控制台日志语句中的 el[id] 应该是 el[idSym] 吗?
      猜你喜欢
      • 2019-05-30
      • 2021-12-06
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2022-12-03
      • 2020-03-25
      • 2019-10-06
      相关资源
      最近更新 更多