typescript - 如何实现这样的泛型?
问题描述
我想实现一个泛型,如下图
// define
class Zoom {
values = {}
addAnimal(animal = {}) {
this.values[animal.name]= animal.total
}
}
// use
const zoom = new Zoom()
zoom.addAnimal({ name: 'tiger', total: 10 })
// hint ====>>>
zoom.values.tiger
谢谢你提供的所有帮助!!!
解决方案
请注意,TypeScript 不跟踪突变。见我的文章。
如果要推断values
属性,则应从addAnimal
方法中返回此属性。
考虑下一个例子:
type Animal = {
name: string,
total: number
}
// define
class Zoom {
values: Record<string, number> = {}
addAnimal<
Name extends string,
Total extends number,
Animal extends { name: Name, total: Total }
>(animal: Animal): this['values'] & Record<Animal['name'], Animal['total']>
addAnimal(animal: Animal) {
this.values[animal.name] = animal.total
return this.values
}
}
// use
const zoom = new Zoom()
const tigerLiteral = zoom.addAnimal({ name: 'tiger', total: 10 })
tigerLiteral.tiger // 10
// hint ====>>>
const tiger = zoom.values.tiger // number
在这里,在我的博客中,您可以找到更多关于如何从函数参数推断文字类型的信息。TL;DR 您应该为要推断的每个值添加通用参数
更新
type Animal = {
name: string,
total: number
}
// define
class Zoom {
values: Record<string, number> = {}
addAnimal<
Name extends string,
Total extends number,
Animal extends { name: Name, total: Total },
>(animal: Animal): this & { values: Record<Animal['name'], Animal['total']> }
addAnimal(animal: Animal) {
this.values[animal.name] = animal.total
return this
}
}
// use
const zoom = new Zoom()
zoom
.addAnimal({ name: 'tiger', total: 10 })
.addAnimal({ name: 'cat', total: 2 })
.values
推荐阅读
- javascript - 如何从 youtube api 获取值?
- java - javax.crypto.BadPaddingException:解密错误,
- azure-iot-central - 向 IoT Central 报告“DateTime”属性的正确 JSON 格式是什么?
- shell - 文件的最后一行未在 shell 脚本中读取
- android - Ionic3 将给定日期更改为所需格式
- android - 更改 android.support.design.widget 的 TextInputLayout 的 boxBackgroundColor
- reactjs - react + redux中的多次/批量删除
- postgresql - 我正在寻找一种将 int 切片或逗号分隔字符串传递到数据库/sql 'in' 查询中的方法
- javascript - WebRTC - 从服务器创建连接客户端-客户端
- cygwin - 符号链接 Cygwin vs. Msys2 vs. Win 10 (mklink)