Javascript—创建一个通用函数,该函数可以将已解构的对象属性作为参数,但某些属性可能会丢失

Javascript—创建一个通用函数,该函数可以将已解构的对象属性作为参数,但某些属性可能会丢失,javascript,typescript,ecmascript-6,optional-parameters,object-destructuring,Javascript,Typescript,Ecmascript 6,Optional Parameters,Object Destructuring,我想找到一种方法,如何将不同的对象传递给同一个函数,并让函数只处理给定对象中存在的输入。 具体地说,我将传递不同的角度组件,并分解对象属性 export function filterVisualData({data, playersOn, typesOn, resultsOn, toBeRemoved, teamsOn, xGOn, shotsOn}) { return data.filter(d => { const result = d.success ? 'Succes

我想找到一种方法,如何将不同的对象传递给同一个函数,并让函数只处理给定对象中存在的输入。 具体地说,我将传递不同的角度组件,并分解对象属性

export function filterVisualData({data, playersOn, typesOn, resultsOn, toBeRemoved, teamsOn, xGOn, shotsOn}) {
  return data.filter(d => {
    const result = d.success ? 'Successful' : 'Unsuccessful';
    const players = playersOn.length === 0 || (playersOn.length > 0 && playersOn.includes(d.player_name));
    const types = typesOn.length === 0 || (typesOn.length > 0 && typesOn.includes(capitalizeAllWords(d.type)));
    const results = resultsOn.length === 0 || (resultsOn.length > 0 && resultsOn.includes(result));
    const removed = !toBeRemoved.map(p => p.time).includes(d.time);
    const shots = shotsOn.length === 0 || (shotsOn.length > 0 && shotsOn.includes(d.type));
    const xG = xGOn.length === 0 || (xGOn.length > 0 && d.xG < Math.max(...xGOn));
    const teams = teamsOn.length === 0 || (teamsOn.length > 0 && teamsOn.includes(d.team_name));
    return players && types && results && removed && shots && xG && teams;
  });
}
导出函数filtersualdata({data,playersOn,typesOn,resultsOn,toBeRemoved,teamsOn,xGOn,shotsOn}){
返回数据。过滤器(d=>{
const result=d.success?'Successful':'Successful';
const players=playersOn.length==0 | |(playersOn.length>0&&playersOn.includes(d.player_name));
const types=typesOn.length==0 | |(typesOn.length>0&&typesOn.includes(大写字(d.type));
const results=resultsOn.length==0 | |(resultsOn.length>0&&resultsOn.includes(结果));
const removed=!toBeRemoved.map(p=>p.time).includes(d.time);
常量shots=shotsOn.length==0 | |(shotsOn.length>0&&shotsOn.includes(d.type));
常数xG=xGOn.length==0 | |(xGOn.length>0&&d.xG0&&teamsOn.includes(d.team_name));
返回球员、类型、结果、删除的镜头和团队;
});
}
问题是一些组件缺少一些属性,我得到了这个错误

TS2345:类型为“this”的参数不可分配给类型为的参数 {data:any;playersOn:any;typesOn:any;resultsOn:any; toBeRemoved:any;teamsOn:any;xGOn:any;shotsOn:any;}。类型 'ShotChart'不能分配给类型{data:any;playersOn:any; typesOn:any;resultsOn:any;toBeRemoved:any;teamsOn:any;xGOn: 任何;肖特森:任何;}。类型中缺少属性“typesOn” “鸟瞰图”


通过执行以下操作,可以传递任何对象而无需Typescript抱怨:

export function filterVisualData(obj: any) {

    const { data, playersOn, typesOn, resultsOn, toBeRemoved, teamsOn, xGOn, shotsOn } = obj

    return data.filter(d => {
        const result = d.success ? 'Successful' : 'Unsuccessful';
        const players = playersOn.length === 0 || (playersOn.length > 0 && playersOn.includes(d.player_name));
        const types = typesOn.length === 0 || (typesOn.length > 0 && typesOn.includes(capitalizeAllWords(d.type)));
        const results = resultsOn.length === 0 || (resultsOn.length > 0 && resultsOn.includes(result));
        const removed = !toBeRemoved.map(p => p.time).includes(d.time);
        const shots = shotsOn.length === 0 || (shotsOn.length > 0 && shotsOn.includes(d.type));
        const xG = xGOn.length === 0 || (xGOn.length > 0 && d.xG < Math.max(...xGOn));
        const teams = teamsOn.length === 0 || (teamsOn.length > 0 && teamsOn.includes(d.team_name));
        return players && types && results && removed && shots && xG && teams;
    });
}
导出函数filtersualdata(obj:any){
const{data,playersOn,typesOn,resultsOn,toBeRemoved,teamsOn,xGOn,shotsOn}=obj
返回数据。过滤器(d=>{
const result=d.success?'Successful':'Successful';
const players=playersOn.length==0 | |(playersOn.length>0&&playersOn.includes(d.player_name));
const types=typesOn.length==0 | |(typesOn.length>0&&typesOn.includes(大写字(d.type));
const results=resultsOn.length==0 | |(resultsOn.length>0&&resultsOn.includes(结果));
const removed=!toBeRemoved.map(p=>p.time).includes(d.time);
常量shots=shotsOn.length==0 | |(shotsOn.length>0&&shotsOn.includes(d.type));
常数xG=xGOn.length==0 | |(xGOn.length>0&&d.xG0&&teamsOn.includes(d.team_name));
返回球员、类型、结果、删除的镜头和团队;
});
}

因此,在编译时不会出现错误,但在运行时仍然会出现错误。如果您没有通过
playersOn
,那么您将得到
无法读取未定义长度的
崩溃。您需要为每个值实施故障保护。

您还可以利用接口和内置在TypeScript中的部分

export interface IData {
    success: boolean;
    player_name: string;
    type: string;
    time: string;
    team_name: string;
}
export interface IBaseArgs {
    data: IData[] , 
    playersOn: <TypeHere>, 
    typesOn: <TypeHere>, 
    resultsOn: <TypeHere>, 
    toBeRemoved: <TypeHere>, 
    teamsOn: <TypeHere>, 
    xGOn: <TypeHere>, 
    shotsOn: <TypeHere>
}

export function filterVisualData<T extends Partial<IBaseArgs>>(obj: T) {
  const {data, playersOn, typesOn, resultsOn, toBeRemoved, teamsOn, xGOn, shotsOn} = obj;
  return data.filter(d => {
    const result = d.success ? 'Successful' : 'Unsuccessful';
    const players = playersOn.length === 0 || (playersOn.length > 0 && playersOn.includes(d.player_name));
    const types = typesOn.length === 0 || (typesOn.length > 0 && typesOn.includes(capitalizeAllWords(d.type)));
    const results = resultsOn.length === 0 || (resultsOn.length > 0 && resultsOn.includes(result));
    const removed = !toBeRemoved.map(p => p.time).includes(d.time);
    const shots = shotsOn.length === 0 || (shotsOn.length > 0 && shotsOn.includes(d.type));
    const xG = xGOn.length === 0 || (xGOn.length > 0 && d.xG < Math.max(...xGOn));
    const teams = teamsOn.length === 0 || (teamsOn.length > 0 && teamsOn.includes(d.team_name));
    return players && types && results && removed && shots && xG && teams;
  });
}
导出接口IData{
成功:布尔;
玩家名称:字符串;
类型:字符串;
时间:字符串;
团队名称:字符串;
}
导出接口{
数据:IData[],
playersOn:,
typesOn:,
结果:,
待删除:,
汤姆森:,
xGOn:,,
肖特森:
}
导出函数filterVisualData(对象:T){
const{data,playersOn,typesOn,resultsOn,toBeRemoved,teamsOn,xGOn,shotsOn}=obj;
返回数据。过滤器(d=>{
const result=d.success?'Successful':'Successful';
const players=playersOn.length==0 | |(playersOn.length>0&&playersOn.includes(d.player_name));
const types=typesOn.length==0 | |(typesOn.length>0&&typesOn.includes(大写字(d.type));
const results=resultsOn.length==0 | |(resultsOn.length>0&&resultsOn.includes(结果));
const removed=!toBeRemoved.map(p=>p.time).includes(d.time);
常量shots=shotsOn.length==0 | |(shotsOn.length>0&&shotsOn.includes(d.type));
常数xG=xGOn.length==0 | |(xGOn.length>0&&d.xG0&&teamsOn.includes(d.team_name));
返回球员、类型、结果、删除的镜头和团队;
});
}

使用
Partial
将使所有键都是可选的,并且函数将接受缺少一些键的对象。您还将获得IntelliSense。

所有这些常量的含义是什么?这更合理,也更容易为=)编写一些类型