생성 개체를 유형에 따라 타이프 라이터

0

질문

지 않도록 말하는 내가 이 유형

type foo = {
 go: string;
 start: string;
}

할 수 있는 방법 dynamicaly 만드는 기능이 반환됩니다

{ go: '', start: '' }

방법은 없에서 스크립트를 입력할 수 있는 우리 동적으로 생성하는 빈 객체를 기반으로 전적으로 입력? 나 이것은 불가능하기 때문에 우리는 그냥 루프

나는 생각은 이와 같은 것

function generate<T>(T)<T>  {
 const obj = {}
 for (const key of keyof T) {
   obj[key] = ''
 }
 return obj
}
typescript
2021-11-23 19:36:25
2

최고의 응답

2

을 실행할 때 타이프 라이터 컴파일러(tsc용)transpile 타이프 라이터 코드를 실행 가능한 자바스크립트 언어의 정적 유형을 시스템을 삭제. 그래서 당신 Foo 형(이름을 변경하는 대문자를 충족 TS 이름 지정 규칙)이 존재하지 않는 모든 형태의 수 있습니다. 아무것도 없다 반복할 수 있을 얻을 열쇠 gostart.


가장 간단한 방법은 뭔가가 일어나서 런타임이 쓰기에 자바스크립트는 그것을 하며,다음을 확인하는 타이프 라이터 컴파일러를 줄 수 있는 강한 유형을 필요로하는 동안 당신은 그것을 쓰기. 이것은 기본적으로 반전 의 어떤 당신이고자 노력하고 있습니다.

귀하의 경우에는 무엇 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 유형입니다. 그래서 우리는 단지 정의 Footype Foo = typeof myFooObject 일을 대신할 수 있습니다. 할 수 있다 아직도 할 수 있지만,나는 여기에서 보여주는 것은 훨씬 더 쉽게 쓰는 건조한 코드 에서 호환되지 않는 경우에 당신은 시작 값으로 생성 유형에서 그들을 대신하려고 그것을 할 다른 방법이다.


다시 사용하는 경우 타이프 라이터 컴파일러 tsc 대로,다음 유형*삭제를 방지 쓰기에서 당신 generate() 에서 정의 Foo. 하지만...

하고자하는 경우 추가 단계를 구축하는 프로젝트를 수행하 는 코드 생성 을 사용하여 타이프 라이터 컴파일러 API 또는 무언가 다음과 같다,당신은 할 수 있습니 임의 것으로 형식입니다. 라이브러리가 있는 비슷한 일을 당신이 무엇을 원하는,예를 들어, ts-자동차-모의 주장하는 모의 객체를 생성하는 개체형처럼 보이는 정확하게 사용하는 경우.

이러한 추가 단계를 구축될 수 있는 합리적인 접근을 위해 당신에,하지만 당신은 아래로 이동 경로를 확인해야 합니는 당신이 사용하지 않는 그냥 평범 타이프 라이터가 더 이상(따라서 주제가 아마 범위에 대한 질문으로 호환되지 않습니 태그).

놀이터에 대한 링크를 코드

2021-11-25 04:07:53
1

당신이 그것을 만들 수 있다 일반적인은 다음과 같습니다.

type foo<T extends string = string> = {
    go: T;
    start: T;
}

const test: foo<''> = {
    go: '',
    start: '',
};

호환되지 않습니 놀이터

2021-11-23 19:47:19

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................