2017-04-12 13 views
1

私は厳密な型として文字列のグループを強制したいと思います。ユーザーは、グループ内の文字列に一致するものだけを渡すことができます。これを実装するにはどうすればいいですか?文字列のグループを型として宣言するには?

これは私がこれまで持っているものです。

const types: Array<string> = [ 'text', 'password' ]; 

interface IAbstractFormElement { 

    value: string; 
    type: Array<types>; 
    required?: boolean; 
    disabled?: boolean; 

} 

現在のエラー:Cannot find name 'types'ほとんど私にはスコープの問題のように思えます。

+0

ここで何をしようとしているのかよく分かりません。 'type'は2つの値のうちの1つだけであり、これはコンパイラによって強制されるようにしようとしていますか? –

+0

@AndrewShepherdまさに! –

+0

あなたの希望はまだ明確ではありません。それはいつも ''テキスト ''や ''パスワード ''であるのか、あるいは変更できるのでしょうか? –

答えて

3

、あなたがstring literals使用することができます:あなたが定義されたインターフェイスでこれを使用して

type types = "text" | "password"; 

const types: types[] = ["text", "password"]; 

interface IAbstractFormElement { 
    value: string; 
    type: types; 
    required?: boolean; 
    disabled?: boolean; 
} 

code in playground

+0

ありがとう!これは私を正しい軌道に乗せる。 2行目は必要ありませんでした。 –

+1

ええ、それは私の推測でしたが、私がそれを含めていることを確かめてください(タイプと変数の両方に同じ名前の 'type'を使用できることを示しています)。 –

+0

より良く反映するようにタイトルと説明を更新しました私は何をしようとしていた。再度、感謝します。 –

1

あなたは

interface IAbstractFormElement { 

    value: string; 
    type: Array<Types>; 
    required?: boolean; 
    disabled?: boolean; 

} 

export interface Types{ 
    text:string; 
    password:string; 
} 

カスタムアレイタイプよりも、以下のように、ユーザー定義型などのカスタム型を宣言する必要があり、私は、あなたのコードでは、この場合

enum Types { 
    text 
    password 
} 


interface IAbstractFormElement { 

     value: string; 
     type: Types; 
     required?: boolean; 
     disabled?: boolean; 

    } 
2

types ISNを列挙型を好むだろう型、それはconst値です。あなたは別のアプローチをとる必要があります。


一つのアプローチは、列挙型を使用することです:

enum InputType { 
    Text = 1, 
    Password = 2 
} 

let t: InputType = InputType.Text; 

しかし、列挙型は、実際には単なる名前の数です。コンパイラによって強制される安全性はありません。例えば、typescriptですコンパイラは、エラーなしで、このようなナンセンスコンパイルう

class InputType { 
    private static Instances = { 
     Text: new InputType("text"), 
     Password: new InputType("password") 
    }; 

    private constructor(private _name:string) { 
    } 

    get Name() : string { 
     return this._name; 
    } 

    static get Password() : InputType{ 
     return InputType.Instances.Password; 
    } 

    static get Text(): InputType{ 
     return InputType.Instances.Text; 
    } 
} 
:厳密値の限られた数を適用するには

let t:InputType = InputType.Text; 
t = InputType.Password; 
t = 72; 
t = Math.PI; 


を、あなたは専用のクラスを作成することができます

コンストラクタはプライベートなので、残りのコードはこれらのうちの1つを作成できません。静的ゲッターメソッドを使用して事前定義された値にアクセスする必要があります。あなたが可能な値ですtypeプロパティにあるかを事前に知っていれば

interface IAbstractFormElement { 
    value: string; 
    type: InputType; 
    required?: boolean; 
    disabled?: boolean; 
} 

var nameControl = <IAbstractFormElement>{ 
    value: 'Harold', 
    type: InputType.Text 
}; 
var passwordControl = <IAbstractFormElement>{ 
    value: '[email protected]', 
    type: InputType.Password 
} 
関連する問題