Несмотря на то, что в ES2015 поддерживаются только статические методы (а не статические свойства) (см. здесь , раздел 15.2.2.2), с любопытством вы можете использовать ниже с Babel с предустановкой es2015
:
class CellState {
v: string;
constructor(v: string) {
this.v = v;
Object.freeze(this);
}
static EMPTY = new CellState('e');
static OCCUPIED = new CellState('o');
static HIGHLIGHTED = new CellState('h');
static values = function(): Array {
const rv = [];
rv.push(CellState.EMPTY);
rv.push(CellState.OCCUPIED);
rv.push(CellState.HIGHLIGHTED);
return rv;
}
}
Object.freeze(CellState);
Я нашел, что это работает как ожидалось даже через модули (например, импортирование перечисления CellState
из другого модуля), а также при импорте модуля с использованием Webpack.
Преимущество этого метода в большинстве других ответов заключается в том, что вы можете использовать его наряду с проверкой статического типа (например, Flow ), и вы можете утверждать, что во время разработки, используя статические проверки типа, что ваши переменные, параметры и т. д. относятся к конкретному CellState
«перечислению», а не к другому перечислению (что было бы невозможно отличить, если вы использовали общие объекты или символы).
В приведенном выше коде есть недостаток в том, что он позволяет создавать дополнительные объекты типа CellState
(даже если они не могут назначить их статическим полям CellState
, поскольку они заморожены). Тем не менее, более совершенный код имеет следующие преимущества:
CellState
values
, которая возвращает все экземпляры перечисления, не должна создавать возвращаемое значение в выше, ручной (и подверженный ошибкам) способ. 'use strict';
class Status {
constructor(code, displayName = code) {
if (Status.INSTANCES.has(code))
throw new Error(`duplicate code value: [${code}]`);
if (!Status.canCreateMoreInstances)
throw new Error(`attempt to call constructor(${code}`+
`, ${displayName}) after all static instances have been created`);
this.code = code;
this.displayName = displayName;
Object.freeze(this);
Status.INSTANCES.set(this.code, this);
}
toString() {
return `[code: ${this.code}, displayName: ${this.displayName}]`;
}
static INSTANCES = new Map();
static canCreateMoreInstances = true;
// the values:
static ARCHIVED = new Status('Archived');
static OBSERVED = new Status('Observed');
static SCHEDULED = new Status('Scheduled');
static UNOBSERVED = new Status('Unobserved');
static UNTRIGGERED = new Status('Untriggered');
static values = function() {
return Array.from(Status.INSTANCES.values());
}
static fromCode(code) {
if (!Status.INSTANCES.has(code))
throw new Error(`unknown code: ${code}`);
else
return Status.INSTANCES.get(code);
}
}
Status.canCreateMoreInstances = false;
Object.freeze(Status);
exports.Status = Status;
Googling показывает marshal_as (untested):
// marshal_as_test.cpp
// compile with: /clr
#include <stdlib.h>
#include <string>
#include <msclr\marshal_cppstd.h>
using namespace System;
using namespace msclr::interop;
int main() {
std::string message = "Test String to Marshal";
String^ result;
result = marshal_as<String^>( message );
return 0;
}
Также см. Обзор маршалинга .
Из MSDN:
#include <string>
#include <iostream>
using namespace System;
using namespace std;
int main() {
string str = "test";
String^ newSystemString = gcnew String(str.c_str());
}