我已经四处寻找,但似乎无法找到答案,希望你能提供帮助。如何为图像添加枚举?这是我理想的,但我得到一个错误。
declare module 'Lib' {
export module Graphics {
export class Image {
enum State {}
static STATE_IDLE: State;
static STATE_LOADING: State;
static STATE_READY: State;
static STATE_ERROR: State;
constructor();
}
}
}
如果我将状态移动到图形模块它可以工作,但现在状态属于图形...这是不正确的,它需要是图像的一部分。
有什么想法吗? 感谢
答案 0 :(得分:32)
我最近也碰到了这个问题。 这就是我目前使用的解决方案:
// File: Image.ts
class Image
{
constructor()
{
this.state = Image.State.Idle;
}
state: Image.State;
}
module Image
{
export enum State
{
Idle,
Loading,
Ready,
Error
}
}
export = Image;
然后在我正在使用该类及其枚举的地方:
import Image = require("Image");
let state = Image.State.Idle;
let image = new Image();
state = image.state;
这似乎工作正常(尽管我不认为这是做这种事情的预期方式)。
希望TypeScript有一种方法可以这样做:
class Image
{
enum State
{
Idle,
Loading,
Ready,
Error
}
constructor()
{
this.state = State.Idle;
}
state: State;
}
export = Image;
答案 1 :(得分:27)
我认为以下是对最高投票解决方案的改进:
export class Image
{
constructor ()
{
this.state = Image.State.Idle;
}
state: Image.State;
}
export namespace Image
{
export enum State
{
Idle,
Loading,
Ready,
Error
}
}
优势在于您可以利用命名导入:
import {Image} from './image';
let img = new Image()
img.state = Image.State.Error
答案 2 :(得分:19)
<强> program.ts:强>
enum Status {
Deleting,
Editing,
Existing,
New
}
export class Program {
static readonly Status = Status;
readonly Status = Program.Status;
title: string;
status: Status;
constructor(init?: Partial<Program>) {
Object.assign(this, init);
}
}
<强>用法:强>
let program = new Program({ title: `some title` });
program.status = Program.Status.New;
或
program.status = program.Status.New;
为Angular 2+用户增加了好处:这可以在模板中使用
<div *ngIf="program.status === program.Status.New">
Only display if status of the program is New
</div>
答案 3 :(得分:3)
我认为这种带有模块扩充的东西是一种非常hacky和非直观的做事方式,所以请考虑一下:
export module Graphics
{
enum State
{
STATE_IDLE,
STATE_LOADING,
STATE_READY,
STATE_ERROR
}
export class Image
{
constructor() { }
public static readonly State = State;
}
}
//...
let imgState = Graphics.Image.State.STATE_ERROR;
也就是说,只需在要导出的类的范围内声明枚举而不导出它,然后通过类的成员公开它。
*关于代码的结构和组织,即使技术上有效,也是如此。
<强>更新强>
declare module Lib
{
enum State
{
STATE_IDLE,
STATE_LOADING,
STATE_READY,
STATE_ERROR
}
class ImageClass
{
constructor();
public Prop: any;
}
export interface Graphics
{
Image: typeof State & ImageClass & (new () => typeof State & ImageClass);
}
}
declare var Graphics: Lib.Graphics;
然后你输入如下:
var someEnum = Graphics.Image.STATE_ERROR;
var image = new Graphics.Image();
var anotherEnum = image.STATE_IDLE;
答案 4 :(得分:2)
我想我可能已经找到了一个解决方案......它是否是有效的TypeScript我不知道但是它有效并且不会导致任何编译错误。这是上述答案的组合。
declare module 'Lib' {
module Graphics {
module Image {
enum State { }
var STATE_IDLE: State;
var STATE_LOADING: State;
var STATE_READY: State;
var STATE_ERROR: State;
}
class Image {
constructor();
}
}
}
任何人都可以发现我没有注意到的任何潜在问题吗?
答案 5 :(得分:1)
我不确定您打算做什么,但我原本希望您希望enum
代表可能的状态值,然后是图片上的state
成员表示图像的当前状态。
declare module 'Lib' {
export module Graphics {
enum State {
STATE_IDLE,
STATE_LOADING,
STATE_READY,
STATE_ERROR
}
export class Image {
public state: State;
constructor();
}
}
}
听起来你想要声明一个具有类似枚举成员的类,而不是在类中声明一个枚举。即:
declare module 'Lib' {
export module Graphics {
export class Image {
static STATE_IDLE: number;
static STATE_LOADING: number;
static STATE_READY: number;
static STATE_ERROR: number;
constructor();
}
}
}
答案 6 :(得分:0)
您可以创建具有相同名称的模块和类。它也可能有助于重命名您的枚举,这样您就不必说State
两次:
declare module 'Lib' {
export module Graphics {
export class Image {
constructor();
}
export module Image {
export enum State {
Idle,
Loading,
Ready,
Error
}
}
}
}