【问题标题】:es6 import. is there any way to use `namespace` as `class` in `generics`?es6 导入。有没有办法在“泛型”中使用“命名空间”作为“类”?
【发布时间】:2018-09-15 12:15:13
【问题描述】:
// `./module.ts`
export class User
{
    name: string
    surname: string
    age: number
}

es6 导入

import * as module from "./module" 生成 namespace module 这很糟糕。

  1. module致电typeof module刹车class generics

    User 类型不能分配给typeof User 类型的参数

  2. 这个module不能被另一个namespace module {}interface module {}调用扩展。

问:

  • 有没有办法在泛型中使用namespace 作为class
  • 有没有办法将模块中的许多类导出为类类型而不需要手工关联?

namespace _0.A - real behavior
namespace _0.B - expected behavior
namespace _1.extend - extend expected behavior

查看typescriptlang.org/play 或继续阅读


// import { User } from "./module"
// import * as module from "./module"
// equal this:
class User
{
  name: string
  surname: string
  age: number
}
namespace module
{
  export class User
  {
    name: string
    surname: string
    age: number
  }
}

namespace _1
{
  let store = {}
  type store<T> = {
    [K in keyof T]: T[K][]
  }
  export function set<T>(k: keyof T, val: T[keyof T])
  {
    if (!(store as store<T>)[k]) (store as store<T>)[k] = [];
    (store as store<T>)[k].push(val)
  }
}

namespace _1.A
{
  type mo = typeof module;
  // --
  set<mo>('User', new User) // [ts] Argument of type 'User' is not assignable to parameter of type 'typeof User'.
}
namespace _1.B
{
  class mo
  {
    User: User
  }
  // --
  set<mo>('User', new User) // ok
}

namespace _1.extend
{
  class Admin
  {
    superpover: true
  }
  // --
  class mo
  {
    User: User
  }
  class moExt extends mo
  {
    Admin: Admin
  }
  // --
  set<moExt>('Admin', new Admin)
}

namespace _0.A
{
  type m = typeof module;
  type user = m['User']   // bad // type user = typeof User
  let age: user['age']   // err // [ts] Property 'age' does not exist on type 'typeof User'.
}
namespace _0.B
{
  class m
  {
    User: User
  }
  type user = m['User']   // good // type user = User
  let age: user['age']   // ok   //
}

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    解决方案

    type Convert<T> = {
        [k in keyof T]: T[k] extends { new(): infer R }
        ? R
        : T[k]
    }
    

    完整的示例代码,在问题的上下文中,看那里typescriptlang.org/play


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      相关资源
      最近更新 更多