如何在打字稿中导出函数

时间:2021-02-24 22:47:36

标签: typescript aws-cdk

打字稿新手。我正在做一个 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 个。我的计划是对我需要制作和传递选项对象的每种类型的绑定使用工厂方法。现在,问题是我写的代码什么都不做。

2 个答案:

答案 0 :(得分:0)

要导出函数,我们需要添加 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';

答案 1 :(得分:0)

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

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. 
}