typescript - 如何在 TypeScript 中将两种类型绑定在一起?
问题描述
我想让 TypeScript 知道,当 getData 函数'myString'
作为参数接收时,它会返回 a Promise<string>
,而当它接收到 时'myNumber'
,它会返回 a Promise<number>
。我认为这种方法可行,但它给了我如下所示的错误。它不绑定endpoint: 'myString'
到returnType: string
. 我需要改变什么?
type MyStringType = { endpoint: 'myString'; returnType: string };
type MyNumberType = { endpoint: 'myNumber'; returnType: number };
function getData<T extends MyStringType | MyNumberType>(endpoint: T['endpoint']) {
return axios.get<T['returnType']>(`https://my.url/${endpoint}`);
}
getData('myString').then(response => {
const newString: string = response.data; // Type 'string | number' is not assignable to type 'string'.
});
getData('myNumber').then(response => {
const newNumber: number = response.data; // Type 'string | number' is not assignable to type 'number'.
});
解决方案
该类型MyStringType | MyNumberType
似乎是默认推断的。你可能不想要这个。
除了函数重载或使用某种XOR 类型之外,您还可以定义如下类型:
type EndpointReturnTypes = {
'myString': string,
'myNumber': number,
}
然后这行得通
async function getData<T extends keyof EndpointReturnTypes>(endpoint: T) {
return axios.get<EndpointReturnTypes[T]>(endpoint)
}
getData('myString').then(response => {
const newString: string = response.data;
});
getData('myNumber').then(response => {
const newNumber: number = response.data;
});
推荐阅读
- php - 多重身份验证验证不起作用
- python - 有没有办法将'pos_tag'值放入python nltk中字典内的列表中?
- c - C初学者关于文件
- powershell - 批量重命名 - 再次
- docker - 将 tar 文件导入私有 docker 注册表
- sql - 如何在Jmeter脚本中间执行数据库查询,并将检索到的数据作为验证码?
- c# - C# WPF 类属性重置为空
- vb.net - VB .NET 自动化,Document.SaveAs 破坏 Word 文档
- javascript - 为什么我的 JavaScript 函数没有触发?
- c# - 如何在项目 appsettings.json 中配置多个 QnA 模型?