从对象的值中键入

时间:2017-06-22 15:03:03

标签: typescript

我最近遇到了严格指定的允许字符串传递给函数的问题:

public void clickLink(String xPath,String nr,String nr1,WebDriver fd){
   new WebDriverWait(fd, 90).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading_bg")));
   element = fd.findElement(By.xpath(xPath));
   element.click();

上面列出的功能只接受type TypesList = 'foo' | 'bar' | 'baz'; function send(type: TypesList): void {}; send('foo'); // Ok send('error'); // Error 的三个值中的一个。我基本上想要做的是从常量值中提供类型联合,因此在将来修改的情况下,我不需要在任何地方更新值。

TypedList

我意识到我可以简单地复制常量中的值或检查函数,但我正在寻找一种更清晰,更健壮的方法来处理它。

1 个答案:

答案 0 :(得分:2)

自TypeScript 2.4.0以来,字符串枚举可用,这似乎正是您所寻找的:

enum Type {
    foo = 'foo1',
    bar = 'bar2'
}

function send(type: Type): void {};
send(Type.foo);

枚举编译为将键名映射到值的字典,以便在运行时使用。如果您不需要,只需将其设为const enum

除此之外,目前无法将类型定义为对象的所有值的并集,即使该对象是常量也是如此。 建立字符串联合将是常用的方法,因为创建字符串文字类型的联合的主要目的是创建一个类似于枚举的结构,其中字符串作为其数据类型。幸运的是,我们现在有字符串枚举。

由于您将在任何地方使用明确定义的常量,因此您也可能不需要这样的联合类型。在这种情况下,您可以将常量括在命名空间中,让函数采用普通的string

namespace Types {
    export const foo = "foo1";
    export const bar = "bar2";
}

function send(type: string): void {};
send(Types.foo);