写一个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] };
      }
    })
  );
};