【问题标题】:How to export functions in typescript如何在打字稿中导出函数
【发布时间】:2021-02-24 22:47:36
【问题描述】:

总打字稿新手。我正在做一个 cdk 项目。我有一个越来越庞大的类(堆栈)。所以我想将一堆方法卸载到其他文件中以使其易于管理。

这行得通:

import * as cdk from '@aws-cdk/core';
import * as lambda        from '@aws-cdk/aws-lambda';                // need for Runtime
import * as lambda_nodejs from '@aws-cdk/aws-lambda-nodejs';

const TAG = "sn-v1-";

export class SnProdStack extends cdk.Stack {
    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
      super(scope, id, props);

      // Lambda: Get stuff from Sigfox API
      // ---------------------------------
      
      const testLambda = new lambda_nodejs.NodejsFunction(this, 'sigfox-get', {
        runtime: lambda.Runtime.NODEJS_12_X,
        entry: 'lambda/sn-prod/sigfox-get.js',
        handler: 'handler',
        functionName: TAG + 'sigfox-get',
        description: 'Get all devices from Sigfox API.',
        memorySize: 256,
        timeout: cdk.Duration.seconds(360)
      });
    }
}

但我想做这样的事情:

// class file
import * as cdk from '@aws-cdk/core';
import * as lambda        from '@aws-cdk/aws-lambda';                // need for Runtime
import * as lambda_nodejs from '@aws-cdk/aws-lambda-nodejs';

import { genSigfoxGetLambda } from './sn-prod/api-gw';

export class SnProdStack extends cdk.Stack {
    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
      super(scope, id, props);      
      const testLambda = this.genSigfoxGetLambda;
    }
}



// method file
import { SnProdStack } from '../sn-prod-stack';

import * as cdk from '@aws-cdk/core';
import * as lambda        from '@aws-cdk/aws-lambda';                // need for Runtime
import * as lambda_nodejs from '@aws-cdk/aws-lambda-nodejs';

const TAG = "sn-v1-";

export function genSigfoxGetLambda(this: SnProdStack) {
    const testLambda = new lambda_nodejs.NodejsFunction(this, 'sigfox-get', {
        runtime: lambda.Runtime.NODEJS_12_X,
        entry: 'lambda/sn-prod/sigfox-get.js',
        handler: 'handler',
        functionName: TAG + 'sigfox-get',
        description: 'Get all devices from Sigfox API.',
        memorySize: 256,
        timeout: cdk.Duration.seconds(360)
      });
      return testLambda;
}

这是一个很小的最小可重现示例。整个代码非常庞大,每件事都有 10 或 20 个。我的计划是对我需要制作的每种类型的绑定使用工厂方法并传入一个选项对象。现在的问题是我写的代码什么都不做。

【问题讨论】:

  • “什么都没有”是什么意思?
  • const testLambda = this.genSigfoxGetLambda; 没有调用函数,只是分配它。
  • @DigitalDrifter OK...为什么第一个版本有效。那是在做同样的事情,不是吗?
  • 不,第一个示例是您将新实例分配给testLambda。二是对导入的函数进行赋值,需要实际调用函数获取返回值,即const testLambda = this.genSigfoxGetLambda(this);
  • 啊哈。 const testLambda = this._genSigfoxGetLambda();private _genSigfoxGetLambda = genSigfoxGetLambda; 有效。非常混乱的语言。

标签: typescript aws-cdk


【解决方案1】:

要导出一个函数,我们需要添加export 指令并使其可用于当前文件夹之外的其他文件。

您已经在使用export 关键字,所以现在您需要做的就是在每个文件夹中放置一个index.ts 文件。

例如,如果我们有这样的目录结构...

.
├── main.ts
└── module
    ├── a.ts
    └── index.ts

...我们希望从a.ts 导出一个函数并在main.ts 中使用它,那么该函数必须使用export 关键字并且index.ts 必须从module/ 导出它。

// a.ts
export const foo = () => { return 'bar'; };
// index.ts
export * from './a';

然后,我们可以导入函数。

// main.ts
import { foo } from './module';

【讨论】:

    【解决方案2】:

    从你的主堆栈中尝试这样的事情

    import cdk = require("@aws-cdk/core");
    import { MyFirstStack } from "../lib/my-first-stack";
    import { StepFunctionStack } from "../lib/step-function-stack";
    
    const app = new cdk.App();
    const myFirstStack = new MyFirstStack(app, "stackName");
    const stepFunctionStack = new StepFunctionStack(app, "stepFunctionStackName");
    
    // If you need to add a dependency on one of your stacks
    myFirstStack.addDependency(stepFunctionStack);
    

    然后您可以在从上面导入的位置中的其他堆栈,在我的示例中,它的后 1 文件夹和 lib 文件夹中..

    这是其中一个堆栈的样子

    import { Construct, Stack, StackProps } from "@aws-cdk/core";
    
    export class MyFirstStack extends Stack {
      constructor(scope: App, id: string, props?: StackProps) {
        const properties: StackProps = {
          env: {
            region: "us-east-1",
            account: <account>,
          },
        };
    
        super(scope, id, properties);
    
        const lambda = create_lambda()
    
        create_lambda(){
        // code to create lambda etc. 
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2019-06-21
      • 2016-11-27
      相关资源
      最近更新 更多