typescript - Typesript 参数依赖于另一个具有默认值的参数
问题描述
我正在尝试在 typescript 中创建一个函数,其中第二个可选参数是第一个参数的键。没有可选参数,我想要的函数看起来像
function getVal<T>(obj: T, key: keyof T) {
return obj[key];
}
但是,我想key
是可选的,并采用默认值"id"
. 但是,函数
function getValBad<T>(obj: T, key: keyof T = "id") {
return obj[key];
}
不进行类型检查,因为打字稿不知道是否T
有id
. 解决此问题的部分方法是编写
function getValOk<T extends { id: any }>(obj: T, key: keyof T = "id") {
return obj[key];
}
然而,这股力量T
总是有一把钥匙的id
。
我的问题是,我可以编写一个函数getValGood
来进行类型检查getValGood({id: 1})
、类型检查getValGood({ID: 1}, "ID")
并且getValGood({ID: 1})
不进行类型检查。如果是这样,我如何getValGood
在打字稿中表示?
解决方案
首先,您可能希望使用另一个通用参数来正确键入返回值。(否则,obj[key]
将返回对象上所有可能值的联合,而不仅仅是at 的类型key
)
您可以重载该getVal
函数以获取一个对象和一个作为该对象属性的键(2 个泛型),或者仅使用一个泛型{ id: V }
并返回 V 类型的内容:
type GetVal = {
<T, K extends keyof T>(obj: T, key: K): T[K];
<V>(obj: { id: V }): V;
};
const getVal: GetVal = (obj: Record<string, unknown>, key = 'id') => {
return obj[key];
};
const result1 = getVal({ foo: 'foo' }, 'foo');
const result2 = getVal({ foo: 'foo' }, 'doesntexist'); // Fails
const result3 = getVal({ id: 'val' });
const result4 = getVal({ }); // Fails
推荐阅读
- firebase - 在 a/b 测试中暂停注册,但仍然有良好的变体体验 [Firebase]
- scala - scala反射,获取超类的类型参数
- spring - Hibernate JOIN FETCH - 对象在结果集中出现多次
- mysql - Elastix 4 和 MariaDB 5.5.50:无法复制外键约束
- c - 使用双矩阵变量将 char 转换为 char[1]
- android - 为什么textView有权重时减去topPadding无效?
- sql-server - 不同数据库上的两个不同大小的相同表
- sql - 插入到不同的表中
- html - 阻止悬停在内部元素上?
- java - 了解 getViewTreeObserver