代码之家  ›  专栏  ›  技术社区  ›  Cerberus

声明要在不同的文件中使用的const enum

  •  0
  • Cerberus  · 技术社区  · 6 年前

    react-scripts-ts ). 所以,我们不能在它们之间进行交叉导入,因为这会破坏传输代码中的文件结构。以下类型的结构:

    /
    |-client
    | |-src
    |   |-index.tsx
    |   |-common.d.ts
    |-src
      |-custom.d.ts
      |-app.ts
    

    目前,整个项目看起来是这样的(有意简化)。客户端:

    common.d.ts :

    type UnionType = 'string1' | 'string2';
    

    index.tsx

    import * as React from 'react';
    import * as ReactDOM from 'react-dom';
    
    const enum Type {
        Type1 = 'Type1',
        Type2 = 'Type2'
    }
    
    interface Props {
        param1: Type;
        param2: UnionType;
    }
    
    class App extends React.Component<Props> {
        render() {
            switch (this.props.param1) {
                case Type.Type1:
                    return <div>{'Type 1 + ' + this.props.param2}</div>;
                case Type.Type2:
                    return <div>{'Type 2 + ' + this.props.param2}</div>;
            }
        }
    }
    
    ReactDOM.render(
    <App
        param1={Math.random() > 0.5 ? Type.Type1 : Type.Type2}
        param2="string1"
    />, document.getElementById('root'));
    

    服务器端:

    custom.d.ts

    /// <reference path="../client/src/common.d.ts" />
    

    app.ts :

    const enum Type {
        Type1 = 'Type1',
        Type2 = 'Type2'
    }
    
    const type: Type = Type.Type1;
    const item: UnionType = "string1";
    console.log(`Result is "${type}" + "${item}"`);
    

    我想搬家 const enum Type 普通d.T 以消除代码重复。但只是宣布它是这样,并从两者中删除 应用程序ts

    declare const enum Type {
        Type1 = 'Type1',
        Type2 = 'Type2'
    }
    

    因为,在后端正确内联时,前端编译 反应脚本ts Type.Type1 因为相应的对象不存在(也不应该存在),所以代码在运行时失败。

    带有MCVE的存储库(在 enum 被移动)是 here .

    const enum

    2 回复  |  直到 6 年前
        1
  •  2
  •   Matt McCutchen    6 年前

    这个问题是特定于 react-scripts-ts 使用 ts-loader 在里面 transpileOnly 模式,它独立地翻译每个源文件(忽略错误),并对所有文件使用单独的传递来报告错误。因此,在一个文件的转换过程中,对其他文件中常量枚举的引用将无法解析,并保留默认状态。其他TypeScript特性,其中发出的代码依赖于其他文件(例如名称空间合并),也不起作用。所以,如果你想使用这个工具链,你不能使用这样的功能。

    这里是 a ts-loader issue

        2
  •  0
  •   basarat    6 年前

    ode在运行时失败,因为相应的对象不存在(而且不应该存在)。

    const enum 在项目之间。您总是会遇到运行时问题。