首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在typescript中导入JSON时如何禁用/断言/覆盖推断类型

在typescript中导入JSON时如何禁用/断言/覆盖推断类型
EN

Stack Overflow用户
提问于 2019-07-03 08:04:18
回答 1查看 175关注 0票数 0

我正在使用TypeScript2.9中的"resolveJsonModule“特性来导入json文件。假设json文件如下所示:

代码语言:javascript
复制
{
  "Nabokov": {
    "Pale Fire": {
      "Pages": "200",
      "Edition": "Paperback",

    },
    "Pnin": {
      "Pages": "150",
      "Edition": "Hardcover"
    },
    "Lolita": {
      "Pages": "150",
      "Edition": "Paperback",
      "Year": "1955"
    }
  },
  "Joyce": {
    "Ulysses": {
      "Pages": "800",
      "Language": "English"
    },
    "Finnegan's Wake": {
      "Pages": "1200",
      "Language": "Gibberish"
    }
  }
}

我通过以下方式导入它:

从'../resources/catalog.json‘导入目录

好的,当这个被导入的时候,typescript会自动为它定义类型。例如,当我试图编写一个可以返回作者/书籍信息的函数时,这对我来说就成了问题。

我只想做

代码语言:javascript
复制
function getBook(author: string, title: string) {
  return catalog[author][title]
}

我得到一个“元素隐式具有'any‘类型,因为类型为'string’的表达式...”所以它希望我将author定义为"Nabokov“| "Joyce”,但由于JSON文件将永远扩展,而我不知道它将在任何时候包含什么,所以我希望“泛化”导入对象的类型,使其类似于key: string。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-03 10:48:36

尝试以下操作:

代码语言:javascript
复制
type C = typeof catalog;
function getBook<T extends keyof C>(author: T, title: keyof C[T]) {
    return catalog[author][title]
}

getBook("Nabokov", "Lolita"); // OK
getBook("Joyce", "Lolita"); // Not OK

这是一个演示的playground

更新

根据您的用例,您不应该限制参数的类型,您应该这样做:

代码语言:javascript
复制
function getBook(author: string, title: string) {
    try {
        return (catalog as any)[author][title]
    } catch(e) {
        // do error handling here
    }
}

更新2

上面提到的方法或多或少绕过了TypeScript。如果你真的想要确保类型安全,这里有一个真正的TypeScript方法来做同样的事情。

代码语言:javascript
复制
type B = {
    Pages: string;
    Edition?: string;
    Year?: string;
    Language?: string;
};
type C = {
    [index: string]: {
        [index:string]: B
    }
};

function getBook(author: string, title: string): B | undefined {
    const cat: C = catalog;
    if(author in cat && title in cat[author]) {
        return cat[author][title];
    } else {
        // do error handling here
        return undefined;
    }
}

请参阅此playground

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56861367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档