【问题标题】:typescript use object as the type definition打字稿使用对象作为类型定义
【发布时间】:2021-11-18 09:14:21
【问题描述】:

假设我有

clients/
  index.ts
  client1.ts
  client2.ts
myApp.ts

// client1.ts
export default class Client1 {}
// client2.ts
export default class Client2 {}

// clients/index.ts
import Client1 from './client1';
import Client2 from './client2';
export { client1, client2 };

现在,我想使用 myApp 中的所有客户端并将类型设置为基于此,即

// myApp.ts

import * as clients from './clients';

type Clients = {
 [key in keyof typeof clients]: clients[key];
}

const allClients: Clients = {
  client1: new clients.Client1(),
  client2: new clients.Client2(),
}

上面的代码无效,clients[key]; 抛出一个关于Cannot use namespace 'clients' as a type. 的错误,但我基本上希望能够导入所有客户端,并将该对象用作我所有客户端的类型定义。这可能吗?

【问题讨论】:

  • 客户端是否有任何从同一个接口/类扩展的东西?还是它们完全不同?
  • 这个问题有多少错别字?从表面上看,您需要(typeof clients)[key] 而不是clients[key],但是当范围内没有任何名称为client1client2 时,如何导出{client1, client2}?然后你的 allClients 持有类实例,但类型暗示构造函数。你也许可以做this,但我肯定更喜欢minimal reproducible example,唯一的问题是你要问的问题。就像this,也许……这能回答你的问题吗?
  • @kks21199 他们完全不同
  • 如果您创建一个包含客户端之间常用方法的接口,您可以将它们存储在列表中并访问它们。这可能会有所帮助,stackoverflow.com/a/23106997/3126835 这仍然需要您先手动将客户端添加到列表中。

标签: javascript typescript


【解决方案1】:

为什么不手动创建界面呢? 我不认为你将能够像那样动态地创建它。无论如何,您可能希望您的类型在运行时是静态的。它们会更容易推理。

只需定义一个与列出 myApp 或导出它们的位置的客户端的接口。

import * as clients from './clients';

interface Clients = {
   client1: clients.client1,
   client2: clients.client2,
}

const allClients: Clients = {
  client1: new clients.Client1(),
  client2: new clients.Client2(),
}

【讨论】:

  • 这是一个选项,我想看看这是否可以是动态的,不需要手动定义。
  • tsc 在编译时运行,我不认为 tsc 包含一个可以让它执行任意 javascript 代码的 javascript 运行时。我认为这是不可能的。
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 2020-01-17
  • 2021-05-21
  • 2019-01-02
  • 2021-09-27
  • 1970-01-01
  • 2021-12-16
  • 2015-11-06
相关资源
最近更新 更多