2016-05-17 2 views
159

В TypeScript ключевое слово const не может использоваться для объявления свойств класса. Это приводит к ошибке компилятора: «Член класса не может иметь ключевое слово« const ».Как реализовать константы класса в машинописном тексте?

Мне нужно четко указать в коде, что свойство не должно изменяться. Я хочу, чтобы IDE или компилятор ошибся, если я попытаюсь присвоить новое значение свойству после его объявления. Как вы, ребята, это достигаете?

настоящее время я использую свойство только для чтения, но я новичок в машинописном (и JavaScript) и интересно, есть ли лучший способ:

get MY_CONSTANT():number {return 10}; 

Я использую машинописный 1.8. Предложения?

PS: Я сейчас, используя машинописный 2.0.3, поэтому я принял ответ Давида

ответ

242

машинопись 2,0 имеет readonly modifier:

class MyClass { 
    readonly myReadonlyProperty = 1; 

    myMethod() { 
     console.log(this.myReadonlyProperty); 
    } 
} 

new MyClass().myReadonlyProperty = 5; // error, readonly 

Это не совсем постоянная, поскольку она позволяет присваивание в конструкторе, но это самый простой вариант.

Альтернативное решение

Альтернативой является использование static ключевое слово с readonly:

class MyClass { 
    static readonly myReadonlyProperty = 1; 

    constructor() { 
     MyClass.myReadonlyProperty = 5; // error, readonly 
    } 

    myMethod() { 
     console.log(MyClass.myReadonlyProperty); 
    } 
} 

MyClass.myReadonlyProperty = 5; // error, readonly 

Это имеет преимущество, не будучи назначаемыми в конструкторе и существует только в одном месте.

+0

Значит, вам не нужна константа или что-то правильное? – Jackie

+6

Чтобы получить доступ к свойствам вне класса, вам нужно добавить ключевое слово 'export' перед' class', а также 'public static' перед ключевым словом' readonly'. См. Здесь: http://stackoverflow.com/a/22993349 – cbros2008

+0

Вопрос. Было ли неудобно, почему вам нужно имя класса для использования этого свойства readOnly внутри самого класса? 'MyClass.myReadonlyProperty' –

31

Константы могут быть объявить вне классов и использовать в своем классе. В противном случае get свойства является хорошей Обойти

const MY_CONSTANT: string = "wazzup"; 

export class MyClass { 

    public myFunction() { 

     alert(MY_CONSTANT); 
    } 
} 
+4

Thanks; Я беспокоюсь об этой реализации, потому что она не переносима (в модели константа не является фактически частью класса), и она утешает информацию в большую область, но она имеет то преимущество, что она является реальной константой, t изменить его, не поднимая сигнальные колокола. – BeetleJuice

+1

Я понимаю озабоченность, и я считаю, что использование '' get'' очень подходит для вашего дела. – j3ff

+3

. В https://angular.io/docs/ts/latest/guide/style-guide.html используйте вместо этого верблюд верхнего регистра. Верхний регистр для констант не рекомендуется. –

7

Угловой 2 Обеспечивает очень приятную функцию, называемую непрозрачными константами. Создать класс & Определить все константы там, используя непрозрачные константы.

import { OpaqueToken } from "@angular/core"; 

export let APP_CONFIG = new OpaqueToken("my.config"); 

export interface MyAppConfig { 
    apiEndpoint: string; 
} 

export const AppConfig: MyAppConfig = {  
    apiEndpoint: "http://localhost:8080/api/"  
}; 

Вводят его поставщиков в app.module.ts

Вы сможете использовать его через каждые компонентов.

EDIT для угловых 4:

Для угловых 4 новой концепции Injection Токен & Непрозрачной лексемы Устаревший в угловых 4.

Injection Токен добавляет функциональные возможности поверх непрозрачной лексем, позволяет прикрепить тип информации о маркере через машинопись дженериков, плюс Injection лексем, устраняет необходимость добавления @Inject

Пример кода

Угловой 2 Использование непрозрачных Лексем

const API_URL = new OpaqueToken('apiUrl'); //no Type Check 


providers: [ 
    { 
    provide: DataService, 
    useFactory: (http, apiUrl) => { 
     // create data service 
    }, 
    deps: [ 
     Http, 
     new Inject(API_URL) //notice the new Inject 
    ] 
    } 
] 

Угловой 4 Использования Лексемы Инъекционных

const API_URL = new InjectionToken<string>('apiUrl'); // generic defines return value of injector 


providers: [ 
    { 
    provide: DataService, 
    useFactory: (http, apiUrl) => { 
     // create data service 
    }, 
    deps: [ 
     Http, 
     API_URL // no `new Inject()` needed! 
    ] 
    } 
] 

Инъекции маркеры разработаны логически поверх непрозрачных жетонов & непрозрачные жетоны осуждаются в угловых 4.

+5

плюс один. Угловая такая же стабильная, как у 13-летнего подростка. они получают функции, устаревшие через несколько месяцев после их выпуска. мелкая. – Stavm

+0

минус один. Этот вопрос не имеет ничего общего с Угловым. Он запрашивает решение TypeScript. – Ben

6

Вы можете отметить свойства с readonly модификатора в вашем объявлении:

export class MyClass { 
    public static readonly MY_PUBLIC_CONSTANT = 10; 
    private static readonly myPrivateConstant = 5; 
} 

@see TypeScript Deep Dive book - Readonly

0

Либо используйте модификатор readOnly с константой, которую нужно объявить, либо можно объявить константу вне класса и использовать ее специально только в требуемом классе, используя оператор get.

Смежные вопросы