【问题标题】:TypeScript sub modules?TypeScript 子模块?
【发布时间】:2020-09-01 02:19:08
【问题描述】:

目前我这样做:

import {validators} from 'marker';

validators.isEmail('foo@bar.com');

相反,我想:

isEmail('foo@bar.com');
// Without cheating by just: `const isEmail = validators.isEmail`

我如何import 只是isEmail 符号?


这是一个小测试用例,注意我的实际模块有很多验证器和其他子模块(不仅仅是validators

marker.d.ts

declare var marker: marker.marker;

declare module marker {
    export interface marker {
        validators: IValidators;
    }

    export interface IValidators {
        isEmail(input: string): boolean;
    }
}

export = marker;

index.ts

import * as vs from './validators'

export const validators = vs;

validators.ts

export function isEmail(input: string): boolean { return true }

【问题讨论】:

  • 嗯,实际上namespaces 可能是我正在寻找的解决方案...

标签: javascript module typescript ecmascript-6 definitelytyped


【解决方案1】:

你应该作弊。但是你可以使用进一步的解构来使作弊更漂亮(更多https://basarat.gitbooks.io/typescript/content/docs/destructuring.html)。而不是

const isEmail = validators.isEmail;

你可以

const {isEmail} = validators;

【讨论】:

    【解决方案2】:

    你可以试试

    const { validators: { isEmail } } = require('marker');
    
    isEmail('aaa@bbb');
    

    【讨论】:

      【解决方案3】:

      注意确定您不想包含的确切位置

       // Without cheating by just: `const isEmail = validators.isEmail`
      

      以下解决方案基于您不希望在您使用validators.isEmail 的 ts 文件中定义 isEmail 的假设。

      假设index.ts您的标记包的主文件,您可以直接公开所有验证器方法。

      index.ts

         import * as vs from './validators'
      
         export const isEmail = vs.isEmail;
      

      并像下面这样使用它,

        import { isEmail } from 'marker';
      
        isEmail('foo@bar.com');
      

      您还必须对定义文件进行必要的更改。

      【讨论】:

      • 嗯,我想这行得通,但是没有正确的模块布局;就像在 Python 中一样;我可以使用吗? import {isEmail} from 'marker.validators'
      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 2016-07-17
      • 2019-05-09
      • 2019-02-18
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多