小编Flá*_*bôa的帖子

使用枚举键入接口字段的索引签名?

我可以用对象类型表示法描述索引类型限制,如下所示:

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)

enums interface typescript typescript2.0

8
推荐指数
1
解决办法
880
查看次数

这个constexpr虚函数技术是否违反了任何C++ 11/C++ 14规则?

前几天我正在阅读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)

c++ virtual-functions constexpr c++11 c++14

7
推荐指数
1
解决办法
1072
查看次数

G ++不允许我定义名为"major"的成员函数

所以,今天我编写了一些单元测试,突然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)

c++ g++ libc libstdc++ gcc-warning

3
推荐指数
1
解决办法
211
查看次数