繁体   English   中英

在TypeScript中导入JSON时如何禁用/声明/覆盖推断的类型

[英]How to disable/assert/override inferred types when importing JSON in typescript

我正在使用打字稿2.9中的“ resolveJsonModule”功能来导入json文件。 假设json文件如下所示:

{
  "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'导入目录

好的,因此,当导入时,打字稿将自动为此定义类型。 例如,当我尝试编写可以返回作者/书籍信息的函数时,这对我来说就成问题了。

我只想做

function getBook(author: string, title: string) {
  return catalog[author][title]
}

我得到一个“元素隐式具有'any'类型,因为类型为'string'的表达式...”因此,它希望我将作者定义为“ Nabokov”。 “ Joyce”,但由于JSON文件将永远扩展,而且我不知道随时会有什么变化,因此我想“通用化”导入对象的类型,使其类似于[key:串]。

请尝试以下操作:

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

这是一个演示操场

更新

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

function getBook(author: string, title: string) {
    try {
        return (catalog as any)[author][title]
    } catch(e) {
        // do error handling here
    }
}

更新2

上面提到的方法或多或少地绕过TypeScript。 如果确实要确保类型安全,那么这是执行相同操作的真正的TypeScript方法。

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;
    }
}

看到这个操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM