형식화 된 변수에 대한 Typescript 빈 개체


85

내가 가지고 있다고 :

type User = {
...
}

새로 만들고 user싶지만 빈 개체로 설정합니다.

const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any

어떻게해야합니까? 변수가되는 것을 원하지 않습니다 null.


13
또는 user유형 이되기를 원 하거나 빈 객체를 허용하도록 유형을 재정의해야 합니다. 지금, 컴파일러는 정확하게 당신을 말하고 하지 않은 것입니다 . User | {}Partial<User>UseruserUser
jcalz

답변:


174

주의 사항

댓글에서 두 가지주의 할 점이 있습니다.

사용자가 User | {}또는 유형이되도록하거나 빈 개체를 허용하도록 유형을 Partial<User>재정의해야 User합니다. 현재 컴파일러는 사용자가 사용자가 아니라고 올바르게 알려줍니다. –jcalz

유형의 일관성없는 인스턴스를 생성하여 TypeScript의 전체 목적을 훼손하기 때문에 이것이 적절한 대답으로 간주되어야한다고 생각하지 않습니다. 이 예에서 속성 Username은 정의되지 않은 상태로 남아 있지만 유형 주석은 정의 할 수 없다고 말합니다. –Ian Liu Rodrigues

대답

의 하나 타이프의 설계 목표는 것입니다 "정확성과 생산성 사이의 균형을." 이 작업을 수행하는 것이 생산적이면 유형 어설 션 을 사용하여 유형 이 지정된 변수에 대한 빈 개체를 만듭니다.

type User = {
    Username: string;
    Email: string;
}

const user01 = {} as User;
const user02 = <User>{};

user01.Email = "foo@bar.com";

여기 에 당신을위한 실제적인 예가 있습니다 .

제안과 함께 작동하는 유형 단언이 있습니다.


9
감사합니다! 이것은 그것을 해결합니다! 이것은 정답으로 표시되어야합니다 ...
Kokodoko dec. 05 dec. 172017-12-05

3
유형의 일관성없는 인스턴스를 생성하여 TypeScript의 전체 목적을 훼손하기 때문에 이것이 적절한 대답으로 간주되어야한다고 생각하지 않습니다. 이 예에서 속성 Username은 정의되지 않은 상태로 남아 있지만 유형 주석은 정의 할 수 없다고 말합니다.
Ian Liu Rodrigues

2
좋은 지적 @IanLiuRodrigues. 대답에 몇 가지주의 사항을 추가했습니다.
Shaun Luttin

1
@IanLiuRodrigues TypeScript의 목표 중 하나는 정확성과 생산성의 균형을 맞추는 것이므로 이것이 TypeScript의 전체 목적을 훼손 한다고 말하는 것은 약간 극단적입니다. github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
숀 Luttin

21

당신이하려는 일에 정말로 달려 있습니다. 타입은 타입 스크립트의 문서이므로 타입을 생성 할 때 이것이 어떻게 사용되어야하는지에 대한 의도를 보여주고 싶습니다.

옵션 1 : 사용자가 평생 동안 일부 속성을 가질 수 있지만 전부는 아닌 경우

모든 속성을 선택 사항으로 설정

type User = {
  attr0?: number
  attr1?: string
}

옵션 2 : 사용자를 포함하는 변수가 null로 시작할 수있는 경우

type User = {
...
}
let u1: User = null;

실제로 여기서 요점이 할당 될 대상을 알기 전에 User 개체를 선언하는 것이라면 할당 let u1:User없이 수행하고 싶을 것입니다 .

옵션 3 : 아마도 원하는 것

실제로 typescript의 전제는 실수를 방지하기 위해 유형에서 설명하는 정신 모델을 준수하는지 확인하는 것입니다. 객체에 하나씩 추가하려면 TypeScript가 수행하지 않으려는 습관입니다.

좀 더 로컬 변수를 만든 다음 정식 사용자가 될 준비가되었을 때 사용자 포함 변수에 할당 할 수 있습니다. 이렇게하면 부분적으로 형성된 사용자가 결코 남지 않습니다. 그런 것들은 끔찍합니다.

let attr1: number = ...
let attr2: string = ...
let user1: User = {
  attr1: attr1,
  attr2: attr2
}

이것이 그가 무엇을 원하는지 확실하지 않지만 UserAttributes라는 별도의 인수 또는 들어오는 매개 변수를 처리하는 것에 대해 이야기하고있을 수 있습니다. 허용 가능한 사용자 개체가 아닐 수 있으므로 별도로 정의 할 수 있습니다.
unflores

이것은 받아 들여진 대답이되어서는 안됩니다. 아래 Shaun Luttin의 게시물을 참조하십시오.
thargenediad

1

typescript에서 아래와 같이 할 수 있습니다.

 const _params = {} as any;

 _params.name ='nazeh abel'

타입 스크립트는 자바 스크립트처럼 동작하지 않기 때문에 타입을 만들어야합니다. 그렇지 않으면 속성을 객체에 동적으로 할당 할 수 없습니다.


0

빈 개체 리터럴을 선언 한 다음 나중에 값을 할당하는 경우 해당 값을 선택 사항으로 간주 할 수 있으므로 (있을 수도 있고 없을 수도 있음) 물음표와 함께 옵션으로 입력하십시오.

type User = {
    Username?: string;
    Email?: string;
}

0

using const user = {} as UserType은 인텔리 센스 만 제공하지만 런타임 user에는 빈 객체 {}이며 내부에 속성이 없습니다. 그 의미 user.Emailundefined대신 줄 것입니다""

type UserType = {
    Username: string;
    Email: string;
}

따라서 기본 속성을 사용 class하여 constructor실제로 개체를 만들 려면 with 를 사용하십시오 .

type UserType = {
  Username: string;
  Email: string;
};

class User implements UserType {
  constructor() {
    this.Username = "";
    this.Email = "";
  }

  Username: string;
  Email: string;
}

const myUser = new User();
console.log(myUser); // output: {Username: "", Email: ""}
console.log("val: "+myUser.Email); // output: ""

interface대신 사용할 수도 있습니다.type

interface UserType {
  Username: string;
  Email: string;
};

... 그리고 나머지 코드는 동일하게 유지됩니다.


실제로이 constructor부분을 건너 뛰고 다음 과 같이 사용할 수도 있습니다.

class User implements UserType {
      Username = ""; // will be added to new obj
      Email: string; // will not be added
}

const myUser = new User();
console.log(myUser); // output: {Username: ""}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.