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

내가 가지고 있다고 :

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.



답변

주의 사항

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

사용자가 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";

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

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


답변

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

옵션 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
}


답변

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

 const _params = {} as any;

 _params.name ='nazeh abel'

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


답변

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

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


답변

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: ""}


답변