Enum внутри класса (TypeScript файл определения)
Я искал вокруг, но, похоже, не могу найти ответ для этого, надеюсь, вы можете помочь. Как добавить перечисление в изображение? Это то, что я хотел бы идеально, но я получаю сообщение об ошибке.
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();
}
}
}
Если я перемещаю State в модуль Graphics, он работает, но теперь State принадлежит Graphics..., который является неправильным, он должен быть частью Image.
Любые идеи?
Благодаря
Ответы
Ответ 1
Я думаю, что я нашел решение... действительно ли оно 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();
}
}
}
Может ли кто-нибудь выявить какие-либо потенциальные проблемы с этим, что я не заметил?
Ответ 2
Недавно я столкнулся с этой проблемой.
Это то, что я сейчас использую в качестве решения:
// 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;
Ответ 3
Я не уверен, что вы намереваетесь делать, но я бы ожидал, что вы хотите, чтобы 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();
}
}
}
Ответ 4
Я думаю, что следующее усовершенствование в главном голосовавшем решении:
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
Ответ 5
Я думаю, что этот материал с расширением модуля - очень хакерский и неинтуитивный способ * делать вещи, поэтому рассмотрим это:
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;
То есть просто объявите перечисление в области класса, к которому вы хотите добавить его, без его экспорта, а затем выведите его через член класса.
* Что касается структурирования и организации кода BAD, даже если он технически работает.
Обновление
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;
Ответ 6
Вы можете создать модуль и класс с тем же именем. Это также может помочь переименовать ваше перечисление, чтобы вам не пришлось дважды говорить State
:
declare module 'Lib' {
export module Graphics {
export class Image {
constructor();
}
export module Image {
export enum State {
Idle,
Loading,
Ready,
Error
}
}
}
}
Ответ 7
Здесь мое решение.
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>