IT Share you

TypeScript의`keyof`와 유사한`valueof`가 있습니까?

shareyou 2020. 11. 7. 17:54
반응형

TypeScript의`keyof`와 유사한`valueof`가 있습니까?


키와 값이 주어진 값에 개체 속성을 입력으로 할당하면서도 값의 유형을 결정할 수 있기를 원합니다. 설명하기가 조금 어렵 기 때문에이 코드는 문제를 드러내야합니다.

type JWT = { id: string, token: string, expire: Date };
const obj: JWT = { id: 'abc123', token: 'tk01', expire: new Date(2018, 2, 14) };

function print(key: keyof JWT) {
    switch (key) {
        case 'id':
        case 'token':
            console.log(obj[key].toUpperCase());
            break;
        case 'expire':
            console.log(obj[key].toISOString());
            break;
    }
}

function onChange(key: keyof JWT, value: any) {
    switch (key) {
        case 'id':
        case 'token':
            obj[key] = value + ' (assigned)';
            break;
        case 'expire':
            obj[key] = value;
            break;
    }
}

print('id');
print('expire');
onChange('id', 'def456');
onChange('expire', new Date(2018, 3, 14));
print('id');
print('expire');

onChange('expire', 1337); // should fail here at compile time
print('expire'); // actually fails here at run time

나는 변화 시도 value: anyvalue: valueof JWT하지만, 작동하지 않았다.

이상적으로 는 날짜 유형이 아니기 onChange('expire', 1337)때문에 실패 1337합니다.

value: any주어진 키의 값으로 변경 하려면 어떻게 해야합니까?


업데이트 : 질문 제목은 가능한 keyof모든 속성 키 유형의 통합을 제공 하는 방식과 유사하게 모든 가능한 속성 값 유형의 통합을 찾는 사람들을 끌어들이는 것처럼 보입니다 . 먼저 그 사람들을 돕자. 다음 같이 키로 with 조회 유형사용하여 ValueOf유사하게 만들 수 있습니다 .keyofkeyof T

type ValueOf<T> = T[keyof T];

당신에게주는

type Foo = { a: string, b: number };
type ValueOfFoo = ValueOf<Foo>; // string | number

언급 된 질문에 대해보다 좁은 개별 키를 사용 keyof T하여 관심있는 값 유형 만 추출 할 수 있습니다 .

type sameAsString = Foo['a']; // lookup a in Foo
type sameAsNumber = Foo['b']; // lookup b in Foo

키 / 값 쌍이 함수에서 제대로 "일치"하는지 확인하려면 다음과 같이 제네릭 과 조회 유형을 사용해야 합니다.

declare function onChange<K extends keyof JWT>(key: K, value: JWT[K]): void; 
onChange('id', 'def456'); // okay
onChange('expire', new Date(2018, 3, 14)); // okay
onChange('expire', 1337); // error. 1337 not assignable to Date

The idea is that the key parameter allows the compiler to infer the generic K parameter. Then it requires that value matches JWT[K], the lookup type you need.

Hope that helps; good luck!


If anyone still looks for implementation of valueof for any purposes, this is a one I came up with:

type valueof<T> = T[keyof T]

Usage:

type actions = {
  a: {
    type: 'Reset'
    data: number
  }
  b: {
    type: 'Apply'
    data: string
  }
}
type actionValues = valueof<actions>

Works as expected :) Returns an Union of all possible types

참고URL : https://stackoverflow.com/questions/49285864/is-there-a-valueof-similar-to-keyof-in-typescript

반응형