使用jsons键值作为函数参数中自动建议的类型

问题描述 投票:0回答:1

假设我有这样的数据:

{
   key1: 'hardcoded string',
   key2: 'another hardcoded string',
}

我有一个带有 2 个参数的函数,其中第一个参数应指向 key1,另一个参数应指向 THAT KEYS 值。

例如:

funcName('key1', 'hardcoded string')

该功能基本上是这样工作的:

funcName(key, defaultValue) {
   return jsonData[key] || defaultValue
}

现在要获取自动建议的密钥,如果我执行以下操作,则 jsons 密钥可以正常工作:

import data from './data.json'

type JsonData = typeof data

funcName<K extends keyof JsonData>(key: K, defaultValue: JsonData[K]) {
   return jsonData[key] || defaultValue
}

现在,当我尝试传递给 funcName 第一个参数时,我得到建议的 key1、key2,但是当我设置该参数时,比如 key1,我希望第二个参数仅建议“硬编码字符串”。现在上面的代码应该可以工作,但我只得到第一个参数的类型建议,而不是第二个参数。

任何人都可以提供如何让第二个参数建议第一个参数键值的建议吗?

javascript typescript
1个回答
0
投票

所以看看 Github 讨论和threads,我不认为这是 TS 的开箱即用功能。

无论怎样,你都必须写出类型。

要么:

  1. 您在导入时写入类型,或者,
  2. 您为 json 创建一个声明文件。

这是第二种方法。

首先创建一个

data.d.json.ts

const data: {
  key1: 'hardcoded string';
  key2: 'another hardcoded string';
};

export default data;

其次,将以下键添加到

tsconfig.json
内的
compilerOptions

allowArbitraryExtensions : true

来自

allowArbitraryExtensions
的文档:

...当导入路径以不是已知 JavaScript 或 TypeScript 文件扩展名的扩展名结尾时,编译器将以 {file basename}.d.{extension} 的形式查找该路径的声明文件。 ts。例如,如果您在捆绑程序项目中使用 CSS 加载器,您可能需要为这些样式表编写(或生成)声明文件:

现在我们所做的是为 JSON 定义一个非常具体的类型并将其暴露给 TypeScript 编译器。每次在 TS 文件中导入

data.json
时,它都会引用新的声明文件。

结果应该是这样的:

© www.soinside.com 2019 - 2024. All rights reserved.