小编Ser*_*tin的帖子

附带 .mjs 和 .d.ts 但没有 .d.mts 的 Typescript 包 - 如何在启用 ESM 的情况下导入?

介绍

随着Typescript 4.7 中添加的ECMAScript 模块支持,在 TS 构建过程中可能会涉及几个新的文件扩展名.mjs,包括.d.mts. 如果项目启用了此功能,TS 编译器在进行模块解析(定位要导入的文件)时管理起来会更加复杂。新的 ESM 文件扩展名有两种简单的模块:

  1. 模块有.js实现、.d.ts声明文件
  2. 模块有.mjs实现、.d.mts声明文件

问题

并非所有包都符合上述类别。有些软件包附带了.js.mjs版本的实现,但只有.d.ts声明文件,没有 .d.mts

本案的解决规则是什么?它似乎.mjs被优先考虑.js,但拒绝工作,.d.mts如果您不拥有导入的模块,那么如果没有它,就会出现问题。不修改包就可以解决这个问题吗?


例子

对于通过以下配置启用 ESM 的项目

// package.json
"type": "module"

// tsconfig.json
"module": "Node16",
"moduleResolution": "node16"
Run Code Online (Sandbox Code Playgroud)

这取决于一个软件包(例如js-base64),该软件包附带.js, .mjs.d.ts但没有.d.mts

$ ls -l node_modules/js-base64
base64.d.ts
base64.js
base64.mjs
Run Code Online (Sandbox Code Playgroud)

然后当我尝试导入它时

// myfile.ts
import { Base64 …
Run Code Online (Sandbox Code Playgroud)

node.js typescript es6-modules

14
推荐指数
1
解决办法
2万
查看次数

有没有办法将std :: vector <const T*>转换为std :: vector <T*>而无需额外的分配?

假设我有Storage一些Objects有一个聚合指向Objects某个向量中的指针的方法.像这样:

class Storage
{
public:
   std::vector<Object*> aggregate_some_objects(); // non-const version
   std::vector<const Object*> aggregate_some_objects() const; // const version

private:
   std::unordered_map<size_t, Object> m_objects; // data is stored 
                                                 // by-value in a non-vector container
}
Run Code Online (Sandbox Code Playgroud)

通常,有一种方法可以避免在const +非const方法对的实现中使用copy-paste,方法是在其他方面使用它们调用其中一个const_cast.然而,这是不可能的,因为方法的返回类型是不同的.

避免复制粘贴的最直接的方法是const从非const版本调用版本并使用返回std::vector<const T*>来填充单独的版本std::vector<T*>.但是,这将导致至少2个堆分配(每个向量一个).我想避免与第二个向量相关的分配.

我想知道是否有办法写出类似的东西

template <typename T>
std::vector<T*> remove_const_from_vector_of_ptrs(std::vector<const T*>&& input)
{
   std::vector<T*> ret;
   // do some magic stuff here that does not involve
   // more memory allocations
   return ret;
} …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector c++11

13
推荐指数
1
解决办法
1005
查看次数

标签 统计

c++ ×1

c++11 ×1

es6-modules ×1

node.js ×1

stl ×1

typescript ×1

vector ×1