带打字稿的索引签名

时间:2018-03-27 09:48:25

标签: typescript index-signature

在打字稿中启用“noImplicitAny”时,确定正确的索引签名是个问题。

const getFromUri = () => {
  const urlSearch = window.location.search.substring(1);
  const params: { foo?: number; bar?: number } = {};
  if (urlSearch && urlSearch.length > 0) {
    const urlParams = urlSearch.split("&");
    urlParams.forEach((e: string) => {
      const obj = e.split("=");
      params[obj[0]] = obj[1];
    });
  }    
};

它在最后一行说: 错误:(17,11)TS7017:元素隐含地具有'any'类型,因为类型'{foo?:number;吧?:号码; }'没有索引签名。

1 个答案:

答案 0 :(得分:2)

您可以这样做:

const getFromUri = () => {
  const urlSearch = window.location.search.substring(1);

  // Always extract useful types
  type Params = { foo?: number; bar?: number };

  const params: Params = {};
  if (urlSearch && urlSearch.length > 0) {
    const urlParams = urlSearch.split("&");
    urlParams.forEach((e: string) => {
      // Assume key here
      const obj = <[keyof Params, string]>e.split("=");

      // Forgot to parse
      params[obj[0]] = parseInt(obj[1]);
    });
  }    
};

顺便说一句,不要这样做。只需使用URL类或polyfill / library来获取搜索参数。