我正在将react 组件转换为打字脚本,我有一个问题,我无法以任何方式解决它,我不知道原因是什么,为什么我使用varantStyles[Variant][COLOR]错误.

这些类型主要是我试图创建它工作所必需的类型,但出于某种原因,我可以让它正常工作.

Element implicitly has an 'any' type because expression of type 'string | number' can't be used to index type '{ solid: { slate: string; blue: string; white: string; }; outline: { slate: string; white: string; }; }'.
  No index signature with a parameter of type 'string' was found on type '{ solid: { slate: string; blue: string; white: string; }; outline: { slate: string; white: string; }; }'.ts(7053)
import Link from 'next/link'
import clsx from 'clsx'
import React, { AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react';

type ButtonProps = {
  variant: keyof typeof baseStyles;
  color: keyof typeof variantStyles[keyof typeof variantStyles];
  className?: string;
  href?: string;
};

const baseStyles: {
  [baseStyle : string]: string;
} = {
  solid:
    'group inline-flex items-center justify-center rounded-full py-2 px-4 text-sm font-semibold focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2',
  outline:
    'group inline-flex ring-1 items-center justify-center rounded-full py-2 px-4 text-sm focus:outline-none',
}

const variantStyles : {
  solid: {
    slate: string;
    blue: string;
    white: string;
  },
  outline: {
    slate: string;
    white: string;
  }
} = {
  solid: {
    slate:
      'bg-slate-900 text-white hover:bg-slate-700 hover:text-slate-100 active:bg-slate-800 active:text-slate-300 focus-visible:outline-slate-900',
    blue: 'bg-blue-600 text-white hover:text-slate-100 hover:bg-blue-500 active:bg-blue-800 active:text-blue-100 focus-visible:outline-blue-600',
    white:
      'bg-white text-slate-900 hover:bg-blue-50 active:bg-blue-200 active:text-slate-600 focus-visible:outline-white',
  },
  outline: {
    slate:
      'ring-slate-200 text-slate-700 hover:text-slate-900 hover:ring-slate-300 active:bg-slate-100 active:text-slate-600 focus-visible:outline-blue-600 focus-visible:ring-slate-300',
    white:
      'ring-slate-700 text-white hover:ring-slate-500 active:ring-slate-700 active:text-slate-400 focus-visible:outline-white',
  },
}

export function Button({
  variant = 'solid',
  color = 'slate',
  className,
  href,
  ...props
} : ButtonProps ) {
  className = clsx(
    baseStyles[variant],
    variantStyles[variant][color],
    className
  )

  return href ? (
    <Link href={href} className={className} {...props} />
  ) : (
    <button className={className} {...props} />
  )
}


推荐答案

也许这并不是这个问题的确切答案.但我认为,如果重新排列您的类型,您可能不会得到类型错误.如果有帮助的话,我总是试着把类型分开,从后面开始.在你的 case 中是这样的:

type Colors = {
  slate: string;
  white: string;
  blue?: string
}

type BaseStyles = {
  solid: string;
  outline: string;
}

type VariantStyles = {
  solid: Colors;
  outline: Colors;
}

type ButtonProps = {
  variant: keyof BaseStyles;
  color: keyof Colors;
  className?: string;
  href?: string;
}

const baseStyles: BaseStyles = {
  solid: 'your string',
  outline: 'your string',
}

const variantStyles: VariantStyles = {
  solid: { 
    slate: 'your string',
    blue: 'your string',
    et.c
  }

Typescript相关问答推荐

创建一个将任意命名类型映射到其他类型的TypScript通用类型

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

如果一个变量不是never类型,我如何创建编译器错误?

Redux—Toolkit查询仅在不为空的情况下添加参数

将对象属性转换为InstanceType或原样的强类型方法

使用`renderToPipeableStream`时如何正确恢复服务器端Apollo缓存?

如何使用泛型自动推断TS中的类型

不推荐使用Marker类-Google map API警告

类型脚本中没有接口的中间静态类

Vue SFC中的多个脚本块共享导入的符号

Material UI / MUI系统:我如何告诉TypeScript主题是由提供程序传递的?

如何使默认导出与CommonJS兼容

如何 bootstrap TS编译器为类型化属性`T`推断正确的类型?

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

如何正确调用创建的类型?

我不明白使用打字脚本在模板中展开参考

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

JSX.Element';不可分配给类型';ReactNode';React功能HOC

递归JSON类型脚本不接受 node 值中的变量

如何在没有空接口的情况下实现求和类型功能?