我想强制执行一组字符串作为严格类型。用户应该只能传入与组中的字符串匹配的任何内容。我将如何实现这一目标?
这是我到目前为止所做的:
const types: Array<string> = [ 'text', 'password' ];
interface IAbstractFormElement {
value: string;
type: Array<types>;
required?: boolean;
disabled?: boolean;
}
当前错误:Cannot find name 'types'
这对我来说几乎是一个范围问题。
答案 0 :(得分:4)
如果您事先知道type
属性的可能值是什么,那么您可以使用string literals:
type types = "text" | "password";
const types: types[] = ["text", "password"];
interface IAbstractFormElement {
value: string;
type: types;
required?: boolean;
disabled?: boolean;
}
答案 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;
}