typescript - 打字稿无法确定类型
问题描述
我有 2 个具有匹配界面的猫对象
有人可以向我解释为什么我不能将 c1 设置为数字并将 c2 设置为字符串吗?
它不应该能够推断函数中的类型吗?
interface Cat {
name: string;
size: string | number;
}
function getCatSize(cat : Cat) {
if ( isNaN(Number(cat.size))) {
return cat.size;
} else {
return cat.size;
}
}
let cat1 : Cat = {
name: "Cat1",
size: "Big"
};
let cat2 : Cat = {
name: "Cat2",
size: 10
};
var c1 : string = getCatSize(cat1);
// Type 'string | number' is not assignable to type 'string'.
// Type 'number' is not assignable to type 'string'
var c2 : number = getCatSize(cat2);
// Type 'string | number' is not assignable to type 'number'.
// Type 'string' is not assignable to type 'number'.ts(2322)
解决方案
getCatSize
接受Cat
。因此,您可以为对象分配一个size
属性,即number
or ,但不会以任何方式捕获string
有关该函数是否使用number
or版本调用的信息。string
函数本身也返回number | string
,打字稿不能隐含地遵循测试size
和返回值之间的关系。
您可以编写一个函数,该函数使用泛型类型参数来捕获调用该函数的实际类型并返回该类型。
interface Cat<T extends string | number = string | number> {
name: string;
size: T;
}
function getCatSize<T extends string | number>(cat: Cat<T>): T {
if (isNaN(Number(cat.size))) {
return cat.size;
} else {
return cat.size;
}
}
let cat1: Cat<string> = {
name: "Cat1",
size: "Big"
};
let cat2: Cat<number> = {
name: "Cat2",
size: 10
};
var c1: string = getCatSize(cat1);
var c2: number = getCatSize(cat2);
推荐阅读
- python - 预期输入 batch_size (500) 与目标 batch_size (1000) 匹配
- sql - SQL:具有特定模式的 FIter 行
- c - 将值从一个指针重写到另一个
- javascript - Discord.js 角色定位
- flutter - Flutter 小部件,如何使用多个 async Future,。数据加载问题
- javascript - 带有查询参数的 Puppeteer goto 不起作用
- c++ - 函数中的 C++ 类型转换
- awk - 使用 awk 打印字段的一部分
- python - 缺少 Python3_SOABI 的 Windows 上的 find_package python3 错误
- python - 有没有办法在训练期间将弱权重归零?例如,如果权重的绝对值低于 0.05,只需将该权重设置为 0