随着Typescript 4.7 中添加的ECMAScript 模块支持,在 TS 构建过程中可能会涉及几个新的文件扩展名.mjs
,包括.d.mts
. 如果项目启用了此功能,TS 编译器在进行模块解析(定位要导入的文件)时管理起来会更加复杂。新的 ESM 文件扩展名有两种简单的模块:
.js
实现、.d.ts
声明文件.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) 假设我有Storage
一些Object
s有一个聚合指向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)