写一个typesafe';选择';typescript中的函数
写一个typesafe';选择';typescript中的函数,typescript,lodash,Typescript,Lodash,lodash具有拾取功能,其使用方式如下: var object = { 'a': 1, 'b': '2', 'c': 3 }; _.pick(object, ['a', 'c']); // => { 'a': 1, 'c': 3 } 我想用typescript写一个类型安全的版本 此函数的使用应该是 pick(object, o => o.a, o.b) 目标不是两次指定相同的键,同时保护类型安全性 这可能实现吗?听起来您可能正在寻找新的解决方案。你喜欢这个工作吗 funct
lodash
具有拾取功能,其使用方式如下:
var object = { 'a': 1, 'b': '2', 'c': 3 };
_.pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }
我想用typescript写一个类型安全的版本
此函数的使用应该是
pick(object, o => o.a, o.b)
目标不是两次指定相同的键,同时保护类型安全性
这可能实现吗?听起来您可能正在寻找新的解决方案。你喜欢这个工作吗
function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
const ret: any = {};
keys.forEach(key => {
ret[key] = obj[key];
})
return ret;
}
const o = {a: 1, b: '2', c: 3}
const picked = pick(o, 'b', 'c');
picked.a; // not allowed
picked.b // string
picked.c // number
函数拾取(对象:T,…键:K[]):拾取{
const-ret:any={};
keys.forEach(key=>{
ret[key]=obj[key];
})
返回ret;
}
常数o={a:1,b'2',c:3}
选取常数=选取(o,'b,'c');
已拾取。a;//不准
picked.b//string
c//number
lodash类型定义使用拾取
来传播道具,因此您无需手动定义道具。只需使用npm i--save dev@types/lodash
或warn add-D@types/lodash
安装(es2019):
函数拾取(基:T,…键:K[]):拾取{
const entries=keys.map(key=>([key,base[key]]);
返回对象.fromEntries(entries);
}
这是我的,使用Object.assign()
函数拾取(对象:T,键:K[]):拾取{
返回Object.assign(
{},
…keys.map(key=>{
if(object&&object.prototype.hasOwnProperty.call(object,key)){
返回{[key]:对象[key]};
}
})
);
};
您的拾取函数似乎与lodash示例的签名不同?第二个和第三个参数是什么(特别是第三个)?你有没有建议如何去掉这里的任何类型?@DanZawadzki,这取决于。这样做的目的是什么?如前所述,any
不会“渗透”到实现中-这只是从无到有构建对象的最简单方法,而不会使Typescript不满意。在我的版本中,我决定使用partial函数。项目配置通常不允许使用任何接口,因此我想知道如何避免它,而不禁用规则const-ret:Partial={}
而不是const-ret:any={}
我看到的唯一负面影响是,您还需要将返回类型更改为Partial
。不过,如果这对您来说是可行的,听起来是个不错的解决方案。@DanZawadzki基于关于unproxify
的示例,响应将是const ret={}as Pick
。这似乎会导致类型错误,因为Object.fromEntries的返回类型是ts{[k:string];}
function pick<T, K extends keyof T>(object: T, keys: K[]): Pick<T, K> {
return Object.assign(
{},
...keys.map(key => {
if (object && Object.prototype.hasOwnProperty.call(object, key)) {
return { [key]: object[key] };
}
})
);
};