Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generate alias/intermediary type for function definition #60

Open
coyoteecd opened this issue Mar 16, 2022 · 6 comments
Open

Generate alias/intermediary type for function definition #60

coyoteecd opened this issue Mar 16, 2022 · 6 comments

Comments

@coyoteecd
Copy link

@fredericbarthelet

Is it possible to generate an intermediary type/alias for the indexer type of AWS functions? Some plugins expect additional configuration properties in the function definition, and this gives compile errors when using a serverless.ts file.

A good example is https://github.com/go-dima/serverless-plugin-conditional-functions.

My serverless.ts file:

const serverlessConfig: AWS = {
  plugins: [
     'serverless-plugin-conditional-functions',
  ],
 // lots of code
 functions: {
   'func1': {
     handler: 'src/func1.ts',
     events: [/*...eventconfig...*/],
     enabled: 'false'
   }
 }
}

The type definition for functions uses a string indexer, and the type of that indexer is inlined.
I want to do something like this:

type ConditionalFunctionsConfig = {
  functions: {
    [key: string]: { enabled?: boolean | string } & ActualFunctionTypeFromAWSType
  }
};

const serverlessConfig: AWS & ConditionalFunctionsConfig = {
  // ...
}

I couldn't figure out a way to get the type starting from the AWS type def, so I'm hoping that if the @serverless/typescript package would provide an alias, then I could use the alias to extend it with additional props as outlined above.

@colthreepv
Copy link

This is such a painful thing indeed to have
Solution here: https://stackoverflow.com/questions/71278233/how-to-pick-or-access-indexer-index-signature-property-in-a-existing-type-in-typ

@coyoteecd
Copy link
Author

@colthreepv thanks for the link, you saved me. What I was missing was the NonNullable<> part, the error message from tsc for AWS['functions'][string] was not very helpful.

@reikje
Copy link

reikje commented Sep 28, 2022

I think I am in the same boat with the serverless-api-gateway-caching plugin and Typescript. The plugin adds a caching objects to the http event type. Example:

functions: {
    myFunction: {
      handler: ..,
      environment: ..,
      events: [
        {
          http: {
            method: 'get',
            path: ..,
            caching: {
              enabled: true
            }
          } as any,
        },
      ],
    },
  },

The as any is my poor man's solution to get around TS2322. Is there a better way for me than using any here?

@davulrich
Copy link

This is such a painful thing indeed to have Solution here: https://stackoverflow.com/questions/71278233/how-to-pick-or-access-indexer-index-signature-property-in-a-existing-type-in-typ

You saved my life... I've spent 2 hours on this... t would be great to export this automatically from '@serverless/typescript'

export type ServerlessFunction = NonNullable<AWS['functions']>[string]

@ebisbe
Copy link

ebisbe commented May 7, 2023

That convo was really helpful to extend for a different plugin.

@franciscocabral
Copy link

I think this deserves a mention in the readme.

This is such a painful thing indeed to have Solution here: https://stackoverflow.com/questions/71278233/how-to-pick-or-access-indexer-index-signature-property-in-a-existing-type-in-typ

You saved my life... I've spent 2 hours on this... t would be great to export this automatically from '@serverless/typescript'

export type ServerlessFunction = NonNullable<AWS['functions']>[string]

if someone else needs this:

import { AWS } from '@serverless/typescript';

export type Functions = AWS['functions'];
export type Function = NonNullable<Functions>[string];
export type Events = Function['events'];
export type Event = NonNullable<Events>[number];
export type HttpEvent = Exclude<Extract<Event, { http: unknown }>['http'], string>;

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants