在打字稿中声明具有最小/最大长度的字符串类型

时间:2018-08-12 22:13:08

标签: javascript string typescript validation constraints

浏览完文档后,似乎没有直接方法可以检查字符串数据类型的最小/最大长度。

但是,有没有一种方法可以使用一些自定义类型声明字符串数据类型,以便检查字符串长度是否在给定范围内?

2 个答案:

答案 0 :(得分:1)

您可以使用类型构造函数和称为“幻影类型”(read a nice article about this here)的东西来实现此目的,该技术可确保不能将类型直接分配给值。

以下是使用以下技术的StringOfLength<Min,Max>类型的示例:

type StringOfLength<Min, Max> = string & {
  __value__: never // this is the phantom type
};

// This is a type guard function which can be used to assert that a string
// is of type StringOfLength<Min,Max>
const isStringOfLength = <Min extends number, Max extends number>(
  str: string,
  min: Min,
  max: Max
): str is StringOfLength<Min, Max> => str.length >= min && str.length <= max;

// type constructor function
export const stringOfLength = <Min extends number, Max extends number>(
  input: unknown,
  min: Min,
  max: Max
): StringOfLength<Min, Max> => {
  if (typeof input !== "string") {
    throw new Error("invalid input");
  }

  if (!isStringOfLength(input, min, max)) {
    throw new Error("input is not between specified min and max");
  }

  return input; // the type of input here is now StringOfLength<Min,Max>
};

// Now we can use our type constructor function
const myString = stringOfLength('hello', 1, 10) // myString has type StringOfLength<1,10>

// the type constructor fails if the input is invalid
stringOfLength('a', 5, 10) // Error: input is not between specified min and max

 // The phantom type prevents us from assigning StringOfLength manually like this:
const a: StringOfLength<0, 10> = 'hello' // Type '"hello"' is not assignable to type { __value__: never }

这里有一些限制-您无法阻止某人创建无效类型,例如StringOfLength<-1, -300>,但可以添加运行时检查以确保传递了minmaxstringOfLength构造函数的值有效。

答案 1 :(得分:0)

JavaScript的类型很弱。您可能期望像C这样的静态类型的语言行为。

您不需要使用Javascript进行操作。而是以编程方式检查变量/输入的类型和长度(验证)。