代码之家  ›  专栏  ›  技术社区  ›  Tomasz Mularczyk

否定流中的类型

  •  1
  • Tomasz Mularczyk  · 技术社区  · 6 年前

    我有一个像这样的工会类型:

    type ActionTypes = "ACTION_ONE" | "ACTION_TWO" | "ACTION_THREE"
    

    现在我想知道我是否可以输入那个变量 将是一个字符串,但以上都不是 ?

    例如:

    const myStr: ActionTypes = "something" // no error
    const myStr2: ActionTypes = "ACTION_ONE" // error
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   James Kraus    6 年前

    tl;dr:也许有类型断言,但是很难有效地使用

    我不认为有一种直接/可能的方法可以从 string 类型。你 可以 考虑做一个 type assertion 通过(ab)使用 $Call<F, T> ,但这种技术几乎肯定是个坏主意:

    ( Try )

    type ActionTypes = "ACTION_ONE" | "ACTION_TWO" | "ACTION_THREE"
    
    type NonActionFuncType<T> =
      (<T: ActionTypes>(T) => false) & (<T: string>(T) => true);
    
    const good = "blah";
    (true: $Call<NonActionFuncType<typeof good>, typeof good>) // Passes
    
    const bad: "ACTION_ONE" = "ACTION_ONE";
    (true: $Call<NonActionFuncType<typeof bad>, typeof bad>) // Fails
    

    务实地说,我建议你寻找另一种方法来做你想做的事情。流自动将所有字符串文本类型设置为 一串 除非指定类型,否则这种技术不会捕获太多错误( 除非传递的变量是文本字符串类型,否则 )