我可以用对象类型表示法描述索引类型限制,如下所示:
enum Enum {
A = 0,
B = 1,
}
type EnumMap = {
[P in Enum]: string;
}
Run Code Online (Sandbox Code Playgroud)
但是,令人惊讶的是,在接口中使用索引符号时似乎不可能做到这一点:
enum Enum {
A = 0,
B = 1,
}
interface EnumMap {
[P in Enum]: string;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
计算属性名称的类型必须为“字符串”、“数字”、“符号”或“任意”。
有什么原因吗?根据定义,TypeScript 中的枚举只能有字符串或数字值(甚至两者都有,但不推荐这样做),我认为枚举本身对于它列出的所有值都可以像联合类型一样工作。
进一步调查,我还发现,在下面的例子中,EnumValues有 type number, 而不是 (我期望的) 0 | 1。再次,为什么会这样?
const Enum = {
A: 0,
B: 1
};
type EnumKeys = keyof typeof Enum;
type EnumValues = typeof Enum[EnumKeys];
Run Code Online (Sandbox Code Playgroud) 前几天我正在阅读C++文档,并注意到虽然文字类型不能有虚拟成员,但这并不妨碍它们实现虚拟成员.或者至少这是我所理解的.
这是我一直在玩的一些代码:
#include <cassert>
// Some forward declarations:
enum class literal_id;
struct literal_base;
struct literal_a;
struct literal_b;
// Now some definitions:
enum class literal_id {
a, b
};
struct literal_base {
virtual literal_id method() const noexcept = 0;
};
struct literal_a : public literal_base {
constexpr literal_id method() const noexcept final { return literal_id::a; }
constexpr operator literal_b() const noexcept;
};
struct literal_b : public literal_base {
constexpr literal_id method() const noexcept final { return literal_id::b; }
constexpr …Run Code Online (Sandbox Code Playgroud) 所以,今天我编写了一些单元测试,突然G ++给了我一个关于GNU C和我的一个成员函数的意外警告major.为什么我不能在major没有触发G ++的情况下命名成员函数?
这是一个最低限度可行的测试片段:
// Any of these includes trigger the warnings
#include <random>
#include <cstdlib>
class my_class {
public:
void major() const;
};
inline void my_class::major() const {}
int main(void) {
my_class my_obj;
my_obj.major();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是编译的输出(使用g++ --std=c++14 -o test-gcc-major test-gcc-major.cpp):
[flisboac@sonic ~]$ uname -a && lsb_release -a && g++ -v && g++ --std=c++14 -o test-gcc-major test-gcc-major.cpp && ./test-gcc-major
Linux sonic 4.12.10-1-ARCH #1 SMP PREEMPT Wed Aug 30 12:18:42 CEST 2017 …Run Code Online (Sandbox Code Playgroud)