유형이 지정된 인덱싱 변수가 인덱싱되는 개체와 동일한 유형이 아닙니다.

루이스 리조

개체의 최상위 수준과 개체의 가장 깊은 수준에 키를 입력 한 약간 복잡한 개체가 있으며 개체의 두 번째 입력 키를 인덱싱 할 수없는 것 같습니다.

이것은 내 개체와 내 인터페이스 (간체)입니다.

const obj = {
  keyA: {
    variants: {
      "0": false,
      "1": false
    }
  },
  keyB: {
    variants: {
      "0-0": false,
      "0-1": false
    }
  }
}

type Obj = typeof obj;
type ObjKeys = keyof Obj;
type ObjVariants<T extends ObjKeys> = Obj[T]["variants"];

을 (를) selectedKeys.variant사용하여 제대로 인덱싱 할 수없는 함수입니다 defaultVariant.

function getVariant<T extends ObjKeys>(key: T, defaultVariant: keyof ObjVariants<T>) {
  const selectedKey = obj[key];
  const selectedVariant = selectedKey.variants[defaultVariant];
}

내가 얻는 오류는 다음과 같습니다.

Type 'keyof { keyA: { variants: { 0: boolean; 1: boolean; }; }; keyB: { variants: { "0-0": boolean; "0-1": boolean; }; }; }[T]["variants"]' cannot be used to index type '{ 0: boolean; 1: boolean; } | { "0-0": boolean; "0-1": boolean; }'.(2536)

https://github.com/microsoft/TypeScript/issues/21760https://github.com/microsoft/TypeScript/issues/36631의 두 가지 문제와 관련된 것 같습니다. 하지만 " 해결 방법 "이 저에게 효과적입니다. 뭔가 놓친 것 같습니다.

여기에 놀이터에 대한 링크는 다음과 같습니다 https://www.typescriptlang.org/play/index.html?ssl=1&ssc=1&pln=65&pc=3#code/MYewdgzgLgBCBGArGBeGBvAUDGBrApgJ4CCAXBtjjAG4CGATgJa1hQTlZVUBEADN+QBmtADYR8AGkpduARgExhY-NJgBfSmqk4ChAEIdVdJizaGuOPgFp+Q0eO0Xr8u8tUacGjZiiEADvgwAPJIqDC+ASCCcEgA3D7+gSGIANJEEGG6UcFxCQE5iABqDMysEAA8ACow+AAeUPhgACYZyWmEEAB8YckA2pUAur3cxqVs3APxmJiCAK5gwFCM4DAA5vhQxSasVTX1jS0F7V0AFLrklRIwTfjCsyKbJabkWdHJW2MVlZ0AlBQ4oEgsHEInwi3wTXaYQQiF6ukmlEB0BgILBDSaH1MYVR4MhRAAdKNTBBejc7g9MawERogA

다른 사람이 비슷한 것을 경험했거나 제안 된 해결 방법이 있습니까?

PD : I로는 엄격한 타입을 추가하는 시도 obj하고 사용하는 것과 동일한 결과를 발견 typeof obj.

마시 에이 시코 라

디자인에 의한 동작, 즉 디자인 제한처럼 보입니다. 이러한 함수는 하위 유형도 전달할 수 있으므로 유형 안전하기가 어렵습니다. 예를 들어 T extends ObjKeysunion을 다룹니다. keyA | keyB이는이 제약 조건이 변형 중 하나라고 가정 할 수 없음을 의미합니다.

제약 조건을 완전히 설정하기 위해 다음 접근 방식으로 이동할 수 있습니다.

function getVariant
<O extends { [K in K1]: { variants: { [KK in K2]: Obj[K1]["variants"][KK] } } }
, K1 extends keyof Obj
, K2 extends keyof Obj[K1]["variants"]>
  (o: O, key: K1, defaultVariant: K2) {
  const selectedKey = o[key].variants;
  const selectedVariant = selectedKey[defaultVariant];
}
// using
getVariant(obj, 'keyA', '0')

보시다시피 키 K1의 유형을 좁히기 위해 추가 매개 변수를 만들었습니다 K2. 가장 중요한 라인은 { [K in K1]: { variants: { [KK in K2]: Obj[K1]["variants"][KK] } } }입니다. 그것은 우리가 두 키를 모두 다루는 유형을 다루지 만 정의는 여전히 우리 obj유형 과 호환된다는 것을 의미합니다 .

우리는 여전히 obj외부 상수로 사용할 수 있지만 유형 어설 션을 사용해야합니다.

function getVariant<K1 extends keyof Obj, K2 extends keyof Obj[K1]["variants"]>
  (key: K1, defaultVariant: K2) {
  let _obj = obj as { [K in K1]: { variants: { [KK in K2]: Obj[K1]["variants"][KK] } } };
  const selectedKey = _obj[key].variants;
  const selectedVariant = selectedKey[defaultVariant];
}
// using
getVariant('keyA', '0')

이것이 작동하는 이유는 무엇입니까? 우리가 가지고 있거나 가질 정확한 유형으로 유형을 정적으로 설정하기 때문에 작동합니다. T extends AT가 A라는 것을 의미하지 않는다고 말하면 T가 A의 일부 변형이라는 의미도 아닙니다. T extends A우리가 좁히고 T할당 가능한 유형 제한 한다고 해서 A엄격하지 않습니다. 유형을 만들면 유형 {[K in T]: X}, T extends Y이의 정확한 키를 가지며 T가능한 할당 가능한 유형에서에 대해 엄격하게 하나의 유형이 될 것임을 엄격하게 정의합니다 Y. 이러한 엄격한 정의는 같은 정적 값을 설정하는 것과 같습니다 Obj['keyA'].

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

매개 변수화 / 인덱싱 된 유형에서 catamorphism을 작동시키는 방법은 무엇입니까?

분류에서Dev

인덱서가 스핑크스에서 성공적으로 인덱싱되는 동안 인덱스가 표시되지 않는 이유는 무엇입니까?

분류에서Dev

TS2339 : 속성 'X'가 'Y'유형에 존재하지 않습니다 (인덱싱 할 수없는 유형 공용체 케이스).

분류에서Dev

C ++ 유형 인덱스 해싱으로 인해 정의되지 않은 동작이 발생합니다.

분류에서Dev

가변 수의 유형이 지정된 인수와 동일한 수의 유형이 지정된 인수를 갖는 클로저를 취하는 함수?

분류에서Dev

두 개의 인덱싱 된 열에 대한 SQLite 쿼리가 그렇게 느린 이유는 무엇입니까?

분류에서Dev

값이 해당 키의 반환 유형을 가진 함수 인 동안 인터페이스의 키로 객체를 인덱싱합니다.

분류에서Dev

인덱싱 된 아카이브 형식?

분류에서Dev

ElasticSearch는 지정된 용어에서 고유 한 중첩 목록 요소가있는 인덱싱 된 객체를 찾습니다.

분류에서Dev

vhdl의 for 루프에서 인덱스에 액세스 할 수 있습니까? 오류 : 인덱싱 된 이름 접두사 유형 natrual이 배열 유형이 아닙니다.

분류에서Dev

멤버 변수와 동일한 유형의 포인터를 가진 개체에 대한 포인터를 가질 수없는 이유는 무엇입니까?

분류에서Dev

식 유형 개체에 인덱싱을 적용 할 수 없습니다.

분류에서Dev

선택적 속성이있는 유형을 인덱싱 가능한 유형으로 강제 변환

분류에서Dev

테이블 또는 인덱싱 된 뷰에서 CONTAINS 또는 FREETEXT 조건자를 사용할 수 없습니다. 전체 텍스트 인덱싱이 아닙니다.

분류에서Dev

Typescript에서 인덱싱 된 유형에 유형 인수를 전달하는 방법은 무엇입니까?

분류에서Dev

quickbloxsdk : 전달 된 개체가 파일이 아닙니다. 콘텐츠 유형이 잘못 되었나요?

분류에서Dev

Typescript : '문자열'은 복합 개체의 유형을 인덱싱하는 데 사용할 수 없습니다.

분류에서Dev

유형 선언에서 정확한 현재 인덱싱 된 키를 얻을 수 있습니까?

분류에서Dev

Query Optimizer가 인덱싱 된 뷰 인덱스를 완전히 무시하는 이유는 무엇입니까?

분류에서Dev

Typescript : 유형 매핑 된 유형은 원래 유형으로 인덱싱 할 수 없습니다.

분류에서Dev

bean 유형 매개 변수가 유형 변수 인 경우 CDI 유형 안전 분석이 weld 2.2.6에서 작동하지 않습니다.

분류에서Dev

프로토콜 인스턴스로 변수 캐스트가 클래스 인스턴스의 변수와 동일한 기본 유형이 아닙니까?

분류에서Dev

이전 유형 매개 변수의 템플릿 인 C ++ 20 비 유형 템플릿 매개 변수 :은 변수가 아니므로 유효한 템플릿 인수가 아닙니다.

분류에서Dev

Solr를 인덱싱 할 때 파일 유형을 지정하는 방법

분류에서Dev

Elasticsearch에서 인덱스가 아닌 유형으로 필드가 지정되는 이유는 무엇입니까?

분류에서Dev

Pandas 데이터 프레임 인덱싱이 인덱스 유형에 따라 축을 변경하는 이유는 무엇입니까?

분류에서Dev

typescript에서 인덱싱 가능한 유형은 무엇입니까?

분류에서Dev

pulseaudio 싱크 인덱스가 변경되는 것을 방지하는 방법이 있습니까?

분류에서Dev

React unique key-인덱스와 ID는 고유 한 키가 아닙니다.

Related 관련 기사

  1. 1

    매개 변수화 / 인덱싱 된 유형에서 catamorphism을 작동시키는 방법은 무엇입니까?

  2. 2

    인덱서가 스핑크스에서 성공적으로 인덱싱되는 동안 인덱스가 표시되지 않는 이유는 무엇입니까?

  3. 3

    TS2339 : 속성 'X'가 'Y'유형에 존재하지 않습니다 (인덱싱 할 수없는 유형 공용체 케이스).

  4. 4

    C ++ 유형 인덱스 해싱으로 인해 정의되지 않은 동작이 발생합니다.

  5. 5

    가변 수의 유형이 지정된 인수와 동일한 수의 유형이 지정된 인수를 갖는 클로저를 취하는 함수?

  6. 6

    두 개의 인덱싱 된 열에 대한 SQLite 쿼리가 그렇게 느린 이유는 무엇입니까?

  7. 7

    값이 해당 키의 반환 유형을 가진 함수 인 동안 인터페이스의 키로 객체를 인덱싱합니다.

  8. 8

    인덱싱 된 아카이브 형식?

  9. 9

    ElasticSearch는 지정된 용어에서 고유 한 중첩 목록 요소가있는 인덱싱 된 객체를 찾습니다.

  10. 10

    vhdl의 for 루프에서 인덱스에 액세스 할 수 있습니까? 오류 : 인덱싱 된 이름 접두사 유형 natrual이 배열 유형이 아닙니다.

  11. 11

    멤버 변수와 동일한 유형의 포인터를 가진 개체에 대한 포인터를 가질 수없는 이유는 무엇입니까?

  12. 12

    식 유형 개체에 인덱싱을 적용 할 수 없습니다.

  13. 13

    선택적 속성이있는 유형을 인덱싱 가능한 유형으로 강제 변환

  14. 14

    테이블 또는 인덱싱 된 뷰에서 CONTAINS 또는 FREETEXT 조건자를 사용할 수 없습니다. 전체 텍스트 인덱싱이 아닙니다.

  15. 15

    Typescript에서 인덱싱 된 유형에 유형 인수를 전달하는 방법은 무엇입니까?

  16. 16

    quickbloxsdk : 전달 된 개체가 파일이 아닙니다. 콘텐츠 유형이 잘못 되었나요?

  17. 17

    Typescript : '문자열'은 복합 개체의 유형을 인덱싱하는 데 사용할 수 없습니다.

  18. 18

    유형 선언에서 정확한 현재 인덱싱 된 키를 얻을 수 있습니까?

  19. 19

    Query Optimizer가 인덱싱 된 뷰 인덱스를 완전히 무시하는 이유는 무엇입니까?

  20. 20

    Typescript : 유형 매핑 된 유형은 원래 유형으로 인덱싱 할 수 없습니다.

  21. 21

    bean 유형 매개 변수가 유형 변수 인 경우 CDI 유형 안전 분석이 weld 2.2.6에서 작동하지 않습니다.

  22. 22

    프로토콜 인스턴스로 변수 캐스트가 클래스 인스턴스의 변수와 동일한 기본 유형이 아닙니까?

  23. 23

    이전 유형 매개 변수의 템플릿 인 C ++ 20 비 유형 템플릿 매개 변수 :은 변수가 아니므로 유효한 템플릿 인수가 아닙니다.

  24. 24

    Solr를 인덱싱 할 때 파일 유형을 지정하는 방법

  25. 25

    Elasticsearch에서 인덱스가 아닌 유형으로 필드가 지정되는 이유는 무엇입니까?

  26. 26

    Pandas 데이터 프레임 인덱싱이 인덱스 유형에 따라 축을 변경하는 이유는 무엇입니까?

  27. 27

    typescript에서 인덱싱 가능한 유형은 무엇입니까?

  28. 28

    pulseaudio 싱크 인덱스가 변경되는 것을 방지하는 방법이 있습니까?

  29. 29

    React unique key-인덱스와 ID는 고유 한 키가 아닙니다.

뜨겁다태그

보관