假设我有这样的数据:
{
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,我希望第二个参数仅建议“硬编码字符串”。现在上面的代码应该可以工作,但我只得到第一个参数的类型建议,而不是第二个参数。
任何人都可以提供如何让第二个参数建议第一个参数键值的建议吗?
所以看看 Github 讨论和threads,我不认为这是 TS 的开箱即用功能。
无论怎样,你都必须写出类型。
要么:
这是第二种方法。
首先创建一个
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
时,它都会引用新的声明文件。
结果应该是这样的: