样式化的组件插值函数中的“函数上缺少返回类型”错误

时间:2019-09-09 10:28:37

标签: reactjs typescript eslint styled-components

用于从道具中提取主题数据的插值函数会产生“函数缺少返回类型”。 eslint错误。我已经使用声明合并来键入主题数据,如typescript documentation中所述。合并似乎正常,因为props.theme是根据我的声明键入的。

可以通过为插值函数指定返回类型来解决问题

${(props): string => props.theme.colors.secondary}

但是我认为那不是必须的,因为我已经在类型声明文件中指定了props.theme.colors.secondary的类型。此外,在vs代码错误弹出窗口中,返回类型似乎是已知的(function(...): string),但仍然给出错误。

GitHub中的代码。

// App.tsx
import React from 'react';
import styled, { ThemeProvider } from 'styled-components';
import theme from 'theme/default';

const StyledApp = styled.div`
  // The error is caused by this interpolator function     
  background-color: ${(props) => props.theme.colors.secondary};
`;
// styled.d.ts
import 'styled-components';

// Extend the default theme type
declare module 'styled-components' {
  export interface DefaultTheme {
    colors: {
      primary: string;
      primaryLight: string;
      primaryLighter: string;
      primaryDark: string;
      secondary: string;
      secondaryLight: string;
      secondaryDark: string;
      font: string;
    };
  }
}
// theme/default.tsx
import { DefaultTheme } from 'styled-components';

const theme: DefaultTheme = {
  colors: {
    primary: 'hsl(0, 98%, 33%)',
    primaryLight: 'hsl(359, 98%, 41%)',
    primaryLighter: 'hsl(14, 54%, 52%)',
    primaryDark: 'hsl(2, 90%, 20%)',
    secondary: 'hsl(260, 4%, 31%)',
    secondaryLight: 'hsl(35, 13%, 45%)',
    secondaryDark: 'hsl(0, 14%, 1%)',
    font: 'hsl(317, 7%, 79%)'
  }
};

export default theme;
// .eslintrc.js
module.exports = {
  env: {
    browser: true
  },
  parser: '@typescript-eslint/parser',
  extends: [
    'airbnb',
    'airbnb/hooks',
    'plugin:@typescript-eslint/recommended',
    'prettier/@typescript-eslint',
    'plugin:prettier/recommended'
  ],
  parserOptions: {
    ecmaVersion: 2020,
    sourceType: 'module'
  },
  rules: {
    'react/jsx-filename-extension': [1, { extensions: ['.jsx', '.tsx'] }],
    'react/prop-types': 'off'
  },
  settings: {
    'import/extensions': ['.js', '.jsx', '.ts', '.tsx'],
    'import/parsers': {
      '@typescript-eslint/parser': ['.ts', '.tsx']
    },
    'import/resolver': {
      node: {
        paths: 'src',
        extensions: ['.js', '.jsx', '.ts', '.tsx']
      }
    }
  }
};
// tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react",
    "baseUrl": "src"
  },
  "include": ["src"]
}
    // deps
    "@types/react": "16.9.2",
    "@types/react-dom": "16.9.0",
    "@types/styled-components": "^4.1.18",
    "overmind": "^19.1.1",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "react-scripts": "3.1.1",
    "styled-components": "^4.3.2",
    "typescript": "3.6.2"
    "@typescript-eslint/eslint-plugin": "^2.1.0",
    "@typescript-eslint/parser": "^2.1.0",
    "babel-core": "^7.0.0-bridge.0",
    "eslint": "^6.1.0",
    "eslint-config-airbnb": "^18.0.1",
    "eslint-config-prettier": "^6.2.0",
    "eslint-plugin-import": "^2.18.2",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-prettier": "^3.1.0",
    "eslint-plugin-react": "^7.14.3",
    "eslint-plugin-react-hooks": "^1.7.0",
    "prettier": "^1.18.2"

vs代码中的错误弹出窗口 The error popup in vs code

3 个答案:

答案 0 :(得分:1)

我可以通过将以下规则添加到我的.eslintrc.js

来解决问题
'@typescript-eslint/explicit-function-return-type': [
      'error',
      {
        allowExpressions: true
      }
]

它允许函数表达式不具有明确定义的返回类型,从而消除了样式组件的内插器函数作为函数表达式时丢失的返回类型错误。

但是,我仍然不完全满意此解决方案,因为它只是关闭了错误而不是直接修复错误。如果您有更好的解决方案,请分享。

答案 1 :(得分:1)

以下作品:

import styled from 'styled-components';

const StyledApp = styled.div((props) => {
  return {
    background-color: props.theme.colors.secondary,
  };
});

我已按照以下说明在ThemeProviders中设置了index.tsxhttps://stackoverflow.com/a/58462124/2771889

答案 2 :(得分:0)

我测试了您的代码,该代码适用于:https://codesandbox.io/s/eloquent-dan-b3lhd 我认为您的tsconfig.json应该有个问题,没有读成styled.d.ts。 (错过rootDir或include)