을 실행할 때 타이프 라이터 컴파일러(tsc
용)transpile 타이프 라이터 코드를 실행 가능한 자바스크립트 언어의 정적 유형을 시스템을 삭제. 그래서 당신 Foo
형(이름을 변경하는 대문자를 충족 TS 이름 지정 규칙)이 존재하지 않는 모든 형태의 수 있습니다. 아무것도 없다 반복할 수 있을 얻을 열쇠 go
고 start
.
가장 간단한 방법은 뭔가가 일어나서 런타임이 쓰기에 자바스크립트는 그것을 하며,다음을 확인하는 타이프 라이터 컴파일러를 줄 수 있는 강한 유형을 필요로하는 동안 당신은 그것을 쓰기. 이것은 기본적으로 반전 의 어떤 당신이고자 노력하고 있습니다.
귀하의 경우에는 무엇 generate()
하기 위해 필요한 작업에서 런타임은? 음,우리가 추측할 수 있는 값에 의해 생성 generate()
것 객체를 만 들고 string
값 특성,우리는 그것을 전달하는 목록의 키의 개체입니다. 그래서 우리가 작성하는 경우 generate()
하고 그 다음에 정의 Foo
의 관점에서의 출력 generate()
대신 다른 방법?
예를 들어:
function generate<K extends PropertyKey>(...keys: K[]) {
return Object.fromEntries(keys.map(k => [k, ""])) as { [P in K]: string };
}
const myFooObject = generate("go", "start");
type Foo = typeof myFooObject;
/* type Foo = {
go: string;
start: string;
} */
console.log(myFooObject)
/* {
"go": "",
"start": ""
} */
기 generate()
은 일반적인 기능 목록을 사용하는 키(의 유형 K
다)및 생산하는 형식의 값으로 키가 K
고 값의 형식 string
. 그 {[P in K]: string}
은 매핑된 유형 에 해당하는 Record<K, string>
사용 가 Record<K, V>
유틸리티 형식.
구현을 사용합 Object.fromEntries()
을 구축하는 개체의 값을 반환합니다 주장 하는 올바른 형식 때문에 타이프 라이터 보고 Object.fromEntries()
으로 돌아온 유형는 너무 넓은 거리에 있습니다.
어쨌든 호출할 때 const myFooObject = generate("go", "start")
산 가치의 유형 {go: string; start: string}
는 동일 Foo
유형입니다. 그래서 우리는 단지 정의 Foo
로 type Foo = typeof myFooObject
일을 대신할 수 있습니다. 할 수 있다 아직도 할 수 있지만,나는 여기에서 보여주는 것은 훨씬 더 쉽게 쓰는 건조한 코드 에서 호환되지 않는 경우에 당신은 시작 값으로 생성 유형에서 그들을 대신하려고 그것을 할 다른 방법이다.
다시 사용하는 경우 타이프 라이터 컴파일러 tsc
대로,다음 유형*삭제를 방지 쓰기에서 당신 generate()
에서 정의 Foo
. 하지만...
하고자하는 경우 추가 단계를 구축하는 프로젝트를 수행하 는 코드 생성 을 사용하여 타이프 라이터 컴파일러 API 또는 무언가 다음과 같다,당신은 할 수 있습니 임의 것으로 형식입니다. 라이브러리가 있는 비슷한 일을 당신이 무엇을 원하는,예를 들어, ts-자동차-모의 주장하는 모의 객체를 생성하는 개체형처럼 보이는 정확하게 사용하는 경우.
이러한 추가 단계를 구축될 수 있는 합리적인 접근을 위해 당신에,하지만 당신은 아래로 이동 경로를 확인해야 합니는 당신이 사용하지 않는 그냥 평범 타이프 라이터가 더 이상(따라서 주제가 아마 범위에 대한 질문으로 호환되지 않습니 태그).
놀이터에 대한 링크를 코드