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: any
를 value: valueof JWT
하지만, 작동하지 않았다.
이상적으로 는 날짜 유형이 아니기 onChange('expire', 1337)
때문에 실패 1337
합니다.
value: any
주어진 키의 값으로 변경 하려면 어떻게 해야합니까?
업데이트 : 질문 제목은 가능한 keyof
모든 속성 키 유형의 통합을 제공 하는 방식과 유사하게 모든 가능한 속성 값 유형의 통합을 찾는 사람들을 끌어들이는 것처럼 보입니다 . 먼저 그 사람들을 돕자. 다음 과 같이 키로 with 조회 유형 을 사용하여 와 ValueOf
유사하게 만들 수 있습니다 .keyof
keyof 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
'IT Share you' 카테고리의 다른 글
Rspec 3 플래시 메시지 테스트 방법 (0) | 2020.11.07 |
---|---|
집중할 때 Reactjs로 입력의 모든 텍스트를 선택하는 방법은 무엇입니까? (0) | 2020.11.07 |
VB.NET 'With'진술-포용 또는 피? (0) | 2020.11.07 |
C # 애플리케이션에서 전역 키보드 캡처 (0) | 2020.11.07 |
Any의 반대 방법은 무엇입니까 (0) | 2020.11.07 |