>

기본적으로 입력 구성 요소를 작성하기 위해 입력하고 있습니다. select 내 응용 프로그램의 열거 형에 대해 일련의 단일 라이너로 구체적인 유형에 대해 정의하십시오. 그러나 내가 시도하는 것이 무엇이든 입력 문제가 발생하는 것 같습니다. 내가 가진 가장 가까운 것은 이것입니다 :

import React from 'react';
type Props<T> = {
  enumType: T;
  value?: keyof T;
};
type IEnumInput<T = {}> = React.FC<Props<T>>;
const EnumInput: IEnumInput = ({ enumType, value }) => {
  const options = Object.values(enumType).map((x: any) => x.toString());
  return (
    <div>
      Will select from {options.join(',')}, current value is {value}
    </div>
  );
};
type CProps<T> = {
  value?: keyof T;
};
enum MyEnum {
  A = 'a',
  B = 'b',
  C = 'c',
}
const MyEnumInput = (props: React.PropsWithChildren<CProps<MyEnum>>) =>
  EnumInput({ ...props, enumType: MyEnum });

내가 얻는 오류는

  Type '{ enumType: typeof MyEnum; value?: number | "big" | "link" | "small" | "sub" | "sup" | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | ... 35 more ... | undefined; children?: React.ReactNode; }' is not assignable to type 'Props<{}>'.     Types of property 'value' are incompatible.
       Type 'number | "big" | "link" | "small" | "sub" | "sup" | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | "match" | "replace" | "search" | ... 32 more ... | undefined' is not assignable to type 'undefined'.
         Type 'number' is not assignable to type 'undefined'.

이것이 올바른 접근법입니까? 그렇다면 내가 뭘 잘못하고 있습니까?

  • 답변 # 1

    TLDR;

    사용하다 typeof MyEnum 대신에 MyEnum .

    긴 대답 :

    enum을 값으로 혼동하여 enum을 유형으로 혼동합니다.

    액세스 할 때 MyEnum.A 변환 된 js에서 일반 객체 인 값으로 사용하고 속성 '.A'에 액세스하십시오.

    당신이 참조 할 때 MyEnum 유형으로, 실제로 해당 키-값 구조체의 값 부분을 참조하고 있습니다. 'a' | 'b' | 'c' .

    일반 객체의 유형을 얻으려면 MyEnum , 당신은 사용해야합니다 typeof MyEnum .

    참고로, TS에서도 같은 일이 발생합니다.

    선언 할 때 class Dog {} , Dog 유형과 값입니다.

    언급 할 때 Dog 유형으로서이 클래스의 인스턴스 유형입니다. 언급 할 때 Dog 값으로 Dog 클래스 자체, 즉 인스턴스가 아닌 생성자 함수.

    이제 유형을 얻으려면 Dog 생성자 함수를 사용해야합니다. typeof Dog .

관련 자료

  • 이전 xml namespaces - 명령 행을 통해 XML에서 속성 바꾸기
  • 다음 Java에서 char을 ''로 바꾸려고했습니다 그러나 "빈 리터럴 문자"오류가 표시됩니다