型付き変数の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>、になりたいか、Userタイプを再定義して空のオブジェクトを許可する必要があります。現在、コンパイラはそれuserがではないと正しく通知していますUser
jcalz 2017

回答:


174

警告

コメントからの2つの価値のある警告があります。

ユーザーをタイプUser | {}またはPartial<User>、にするか、Userタイプを再定義して空のオブジェクトを許可する必要があります。現在、コンパイラは、ユーザーがユーザーではないことを正しく通知しています。–jcalz

TypeScriptの目的全体を損なう、型の一貫性のないインスタンスを作成するため、これは適切な答えと見なされるべきではないと思います。この例では、プロパティUsernameは未定義のままですが、型アノテーションは未定義にすることはできないと言っています。–Ian Liu Rodrigues

回答

TypeScript設計目標の1つは、「正確さと生産性のバランスをとること」です。これを行うことが生産的である場合は、型アサーションを使用して、型付き変数の空のオブジェクトを作成します。

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

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

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

これがあなたのための実用的な例です

提案を処理するタイプアサーションは次のとおりです。


9
ありがとうございました!これはそれを解決します!これは...正しい答えとしてマークされなければならない
Kokodoko

3
TypeScriptの目的全体を損なう、型の一貫性のないインスタンスを作成するため、これは適切な答えと見なされるべきではないと思います。この例では、プロパティUsernameは未定義のままですが、型アノテーションは未定義にすることはできないと言っています。
Ian

2
良い点@IanLiuRodrigues。私は答えにいくつかの警告を追加しました。
ShaunLuttin19年

1
@IanLiuRodrigues TypeScriptの目標の1つは、正確さと生産性のバランスを取ることです。つまり、これはTypeScriptの目的全体を損なうということですgithub.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
ShaunLuttin19年

21

本当にあなたがやろうとしていることに依存します。タイプはtypescriptのドキュメントであるため、タイプを作成するときに、これがどのように使用されるかについての意図を示したいと思います。

オプション1:ユーザーが存続期間中にすべてではないが一部の属性を持っている可能性がある場合

すべての属性をオプションにする

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

オプション2:ユーザーを含む変数がnullで始まる可能性がある場合

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

ただし、実際には、何が割り当てられるかがわかる前にUserオブジェクトを宣言することが重要な場合は、let u1:User割り当てなしで実行することをお勧めします。

オプション3:おそらく欲しいもの

本当に、typescriptの前提は、間違いを避けるために、タイプで概説するメンタルモデルに準拠していることを確認することです。オブジェクトに1つずつ追加したい場合、これはTypeScriptが実行しないようにしようとしている習慣です。

多くの場合、いくつかのローカル変数を作成し、完全なユーザーになる準備ができたら、ユーザーを含む変数に割り当てます。そうすれば、部分的に形成されたユーザーが残ることはありません。それらはひどいものです。

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

これが彼の目的であるかどうかはわかりませんが、UserAttributesと呼ばれる別の引数、または受信パラメーターを処理するものについて話している可能性があります。受け入れ可能なユーザーオブジェクトではない可能性があるため、個別に定義できます。
unflores

これは受け入れられた答えであってはなりません。下記のShaunLuttinの投稿をご覧ください。
thargenediad

1

あなたはtypescriptで以下のようにこれを行うことができます

 const _params = {} as any;

 _params.name ='nazeh abel'

typescriptはjavascriptのように動作しないため、型を作成する必要があります。そうしないと、プロパティをオブジェクトに動的に割り当てることができません。


0

空のオブジェクトリテラルを宣言し、後で値を割り当てる場合、それらの値はオプションであると見なすことができるため(存在する場合と存在しない場合があります)、疑問符を付けてオプションとして入力するだけです。

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

0

を使用const user = {} as UserTypeするとインテリセンスが提供されますが、実行時にuserは空のオブジェクト{}であり、内部にプロパティがないことに注意してください。つまりuser.Emailundefined代わりに与える""

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

したがって、classwithconstructorを使用して、デフォルトのプロパティを持つオブジェクトを実際に作成します。

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.