typescript - 函数中动态构造对象的窄返回类型
问题描述
我有以下构造函数
function make(x: string) {
const result: { [k: string]: any } = {};
result[x] = true
result.kind = x
return result
}
使用如下
let a = make("A")
将创建一个“类型”的对象
{
A: true,
kind: "A"
}
当与“B”一起使用时
let b = make("B")
将创建一个“类型”的对象
{
B: true,
kind: "B"
}
现在两者a
和b
都将是any
没有类型签名的类型。但是,我希望有一个比任何返回类型都更具体的返回类型。类似的东西
function make(x: string): { $x-val: bool; kind: $x-val } { ....
这有可能吗?
解决方案
以下类型描述可以解决问题
type TT<X extends string> =
(Record<X, true> & Record<"kind", X>) extends infer O ?
{ [P in keyof O]: O[P] } :
never
function make<T extends string>(x: T): TT<T> {
const result: { [k: string]: any } = {};
result[x] = true
result.kind = x
return result as TT<T>
}
推荐阅读
- r - 每年独特事件的累计总数
- sql - 需要将两个数据集绑定到一个 tablix。请在描述中找到图片,如何在 SSRS 中实现这种结构
- php - Apache 重写时出现白屏
- python - 如何将熊猫 groupby 输出转换为单独的 excel 表?
- c# - 如何确定什么样的 OPC 服务器并读取它的项目
- java - If (Char == '\r' ) System.out.println("Exit"); 不工作
- r - 在R中构造相关矩阵的有效方法
- google-sheets - 如何在谷歌表格中附加3个不同列数的表格?
- error-handling - 当最后一行意外取消注释时,注释的*中间*中出现 OpenSCAD 解析器错误?
- ethereum - 如何用更少的gas调用WETH转账?