如何将字符串组声明为类型?

时间:2017-04-12 22:41:12

标签: typescript

我想强制执行一组字符串作为严格类型。用户应该只能传入与组中的字符串匹配的任何内容。我将如何实现这一目标?

这是我到目前为止所做的:

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

interface IAbstractFormElement {

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

}

当前错误:Cannot find name 'types'这对我来说几乎是一个范围问题。

3 个答案:

答案 0 :(得分:4)

如果您事先知道type属性的可能值是什么,那么您可以使用string literals

type types = "text" | "password";

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

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

code in playground

答案 1 :(得分:2)

在您的代码中,types不是类型,它是一个const值。你将不得不采取不同的方法。

<小时/> 一种方法是使用枚举:

enum InputType {
    Text = 1,
    Password  = 2
}

let t: InputType = InputType.Text;

但枚举实际上只是一个命名数字。编译器没有强制执行任何安全措施。

例如,typescript编译器可以无错误地编译,如下所示:

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

<小时/> 要严格执行有限数量的值,您可以创建专用类:

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;
    }
}

因为构造函数是私有的,所以代码的其余部分无法创建其中一个。它必须通过静态getter方法访问预定义的值。

在您定义的界面中使用此功能:

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

var nameControl = <IAbstractFormElement>{
     value: 'Harold',
     type: InputType.Text
};
var passwordControl = <IAbstractFormElement>{
     value: 'P@ssw0rd',
     type: InputType.Password
}

答案 2 :(得分: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;

    }