打字稿:箭头函数的对象 return 一个对象

Typescript: Object of arrow functions that return an Object

鉴于以下情况,

...
const NODE_ENV = 'development';
const sessionConfig = {
 'development': ():session.SessionOptions => ({
   'store': storeConfig.development(),
   'secret': 'REDACTED',
   'resave': false,
   'saveUninitialized': true,
   'cookie': {'secure': false},
   'genid': () => uuidv4()
  }),
  'testing': ():session.SessionOptions => ({
    'store': storeConfig.testing(),
    'secret': 'REDACTED',
    'resave': false,
    'saveUninitialized': true,
    'cookie': {'secure': false},
    'genid': () => uuidv4()
  }),
  'production': ():session.SessionOptions => ({
    'store': storeConfig.production(),
    'secret': process.env.SESSION_SECRET || 'REDACTED',
    'resave': false,
    'saveUninitialized': true,
    'cookie': {
      'secure': process.env.SESSION_COOKIE_SECURE === 'true' || false
    },
    'genid': () => uuidv4()
  })
}
{NODE_ENV} = process.env,
sessionEnvConfig = sessionConfig[NODE_ENV],
sessionEnvObject:session.SessionOptions = sessionEnvConfig(),
sessionObject = session(sessionEnvObject);

export default sessionObject;

每当我尝试使用 tsc 进行编译时,我都会收到此错误:

error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ development: () => SessionOptions; testing: () => SessionOptions; production: () => SessionOptions; }'.
  No index signature with a parameter of type 'string' was found on type '{ development: () => SessionOptions; testing: () => SessionOptions; production: () => SessionOptions; }'.

我似乎无法解决这个 TS 错误?任何人都可以解释这个错误 是什么意思 ,或者至少我做错了什么?我有 90% 的把握确定这是关于我如何(未)定义对象类型的错误,但我不知道如何处理它。 我还有这个 environment.d.ts 文件:

declare global {
  namespace NodeJS {
    interface ProcessEnv {
      [key: string]: string | undefined;
      NODE_ENV?: 'development' | 'production' | 'testing' ;
    }
  }
}

错误是因为 Typescript 正在为 NODE_ENV 推断 string,而不是您的常量值之一。

因此,Typescript 不确定 NODE_ENV(作为 string)对应于对象中的任何键。

你可以试试这个:

const NODE_ENV = 'development' as const;

这样您就可以将 NODE_ENV 的可能值缩小到 development

此外,尝试像这样声明您的 process.env

declare const process: {
    env: {
        NODE_ENV: 'production' | 'development' | 'testing';
    }
}