2016-10-25 3 views
2

Это может быть основной вопрос, но, возможно, мое знание C# меня вводит в заблуждение. В настоящее время я пытаюсь ссылаться на нестандартный тип в TypScript, и он разрешает его, когда я фактически предоставляю строковое значение вместо ссылки на тип. Это то, что у меня есть:Ссылка на тип TypeScript в Angular 2

export type MyCustomeType= 
    'text1' | 
    'text2' | 
    'text3'; 

export class MyCustomeTypeUtils {} 

В моем компоненте я объявил переменные моего пользовательского типа:

var1 : MyCustomeType; 

Единственный способ я var1 иметь значение, если я делаю:

var1 = 'text1' 

Если я

var1 = MyCustomeType.0 

или

var1 = MyCustomeType.text1 

Это ошибка, так как не удалось найти имя MyCustomeType. Любая помощь приветствуется.

ответ

4

Вот как это работает. Это то, что вызывает TypeScript String Literal Types

Строковые литералы позволяют указать точное значение, которое должна иметь строка. На практике строковые литералы типа прекрасно сочетаются с типами соединений, типами защиты и псевдонимами типов. Вы можете использовать эти функции вместе, чтобы получить enum-подобное поведение со строками.

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 
class UIElement { 
    animate(dx: number, dy: number, easing: Easing) { 
     if (easing === "ease-in") { 
      // ... 
     } 
     else if (easing === "ease-out") { 
     } 
     else if (easing === "ease-in-out") { 
     } 
     else { 
      // error! should not pass null or undefined. 
     } 
    } 
} 

let button = new UIElement(); 
button.animate(0, 0, "ease-in"); 
button.animate(0, 0, "uneasy"); // error: "uneasy" is not allowed here 

Вы можете пройти любой из трех разрешенных строк, но любая другая строка даст ошибку

Аргумент типа «непросто"»не может быть назначен для параметра типа '"ease-in" | "ease-out" | "ease-in-out"'

Примечание: Если вы хотите использовать реальные перечисления TypeScript supports that

+0

Итак, чтобы присвоить значение одному из этих типов, я должен дать ему только одну из разрешенных строк вместо того, как используются перечисления? Возможно, я запутался два :) – eagleEye

0

Я попал в подобную ловушку. Что вы можете сделать, так это на вашем классе utils создать статику, которая возвращает тип MyCustomType со строкой text1.

public static readonly Text1:MyCustomType = 'text1'; 

Затем вы можете сделать

let myVar:MyCustomType = UtilClass.Text1; 
+0

Спасибо Dan! Однако этот подход не сработал для меня :( – eagleEye

+0

@eagleEye извините, у меня была моя C# шляпа. Мое изменение на статическую помощь? –

+0

Hi Dan, извините, не видел ваше сообщение до сих пор, я слышу, что я смешиваю языки все время: D. Я попробую и дам вам знать. – eagleEye