给定以下代码

interface IPerson {
   firstName: string;
   lastName: string;
}

var persons: { [id: string]: IPerson; } = {
   "p1": { firstName: "F1", lastName: "L1" },
   "p2": { firstName: "F2" }
};

为什么不拒绝初始化?毕竟,第二个对象没有“lastName”属性。


当前回答

Record<Tkey, Tobject>有点像c#字典

let myRecord: Record<string, number> = {}; 

//Add
myRecord[”key1”] = 1;

//Remove
delete myRecord[”key1"];

//Loop
for (var key in myRecord) {
    var value = myRecord[key];
}

其他回答

Typescript在你的例子中失败了,因为它期望所有字段都出现。使用记录和部分实用程序类型来解决它。

记录<字符串、部分<IPerson>>

interface IPerson {
   firstName: string;
   lastName: string;
}

var persons: Record<string, Partial<IPerson>> = {
   "p1": { firstName: "F1", lastName: "L1" },
   "p2": { firstName: "F2" }
};

解释。

记录类型创建一个字典/hashmap。 部分类型表示某些字段可能缺失。

备用。

如果您希望使姓氏可选,您可以添加?Typescript会知道它是可选的。

lastName?: string;

https://www.typescriptlang.org/docs/handbook/utility-types.html

如果你想忽略一个属性,通过添加一个问号将其标记为可选:

interface IPerson {
    firstName: string;
    lastName?: string;
}

要在typescript中使用字典对象,可以使用interface,如下所示:

interface Dictionary<T> {
    [Key: string]: T;
}

并且,在你的类属性类型中使用这个。

export class SearchParameters {
    SearchFor: Dictionary<string> = {};
}

要使用并初始化这个类,

getUsers(): Observable<any> {
        var searchParams = new SearchParameters();
        searchParams.SearchFor['userId'] = '1';
        searchParams.SearchFor['userName'] = 'xyz';

        return this.http.post(searchParams, 'users/search')
            .map(res => {
                return res;
            })
            .catch(this.handleError.bind(this));
    }

下面是一个更通用的Dictionary实现,灵感来自@dmck

    interface IDictionary<T> {
      add(key: string, value: T): void;
      remove(key: string): void;
      containsKey(key: string): boolean;
      keys(): string[];
      values(): T[];
    }

    class Dictionary<T> implements IDictionary<T> {

      _keys: string[] = [];
      _values: T[] = [];

      constructor(init?: { key: string; value: T; }[]) {
        if (init) {
          for (var x = 0; x < init.length; x++) {
            this[init[x].key] = init[x].value;
            this._keys.push(init[x].key);
            this._values.push(init[x].value);
          }
        }
      }

      add(key: string, value: T) {
        this[key] = value;
        this._keys.push(key);
        this._values.push(value);
      }

      remove(key: string) {
        var index = this._keys.indexOf(key, 0);
        this._keys.splice(index, 1);
        this._values.splice(index, 1);

        delete this[key];
      }

      keys(): string[] {
        return this._keys;
      }

      values(): T[] {
        return this._values;
      }

      containsKey(key: string) {
        if (typeof this[key] === "undefined") {
          return false;
        }

        return true;
      }

      toLookup(): IDictionary<T> {
        return this;
      }
    }

如果你正在寻找一个简单的方法来创建一个字典,即使在typescript中,它是使用Map对象。文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map的链接。Map对象主要有添加、检索、删除和删除所有元素的方法。

dictionary= new Map<string, string>();
dictionary.set("key", "value");
dictionary.get("key");
dictionary.delete("key");
dictionary.clear(); //Removes all key-value pairs