0

let's say I have a model definition like this.

export interface Basicdata {
    materialnumber: number;
    type: string;
    materialclass: string;
}

I furthermore have an array with values, which match exactly the order of the Basicdata model, i.e.

["10003084", "S", "CLIP"]

I am searching for a way to create the object from these values in the array. What I did is creating an empty object and assigning the array values.

const singleRow = rows[0];

const newBD: Basicdata = {
 materialnumber: 0,
 type: '',
 materialclass: '',  
}


newBD.materialnumber = singleRow[0];
newBD.type = singleRow[1];
newBD.materialclass = singleRow[2];

But surely there is a better, more elegant way to do that, no? I looked into map and reduce but could find a way.

Thank you.

4

2 Answers 2

1

As others have mentioned, use a class so that you can use the spread operator (technically you could create a function that returns an objects that meets the interface Basicdata, but you should use a class)

class Basicdata {
  materialnumber: number;
  type: string;
  materialclass: string;

  constructor(materialnumber: string | number, type: string, materialclass: string, ...rest: any) {
    this.materialnumber = typeof materialnumber === "number" ? materialnumber : parseInt(materialnumber);
    this.type = type;
    this.materialclass = materialclass;
  }
}

const rows: [string, string, string][] = [
  ["10003084", "S", "CLIP"],
  ["4324324", "B", "FOUR"],
  ["4444432", "C", "CORN"],
];

const singleRow = rows[0];

const newBD = new Basicdata(...singleRow) ;

Playground link

Sign up to request clarification or add additional context in comments.

Comments

0

The issue with the following solution is that it relies on the order of the object properties being consistent. Is this about what you're looking for?

const singleRow = [1, "2", "3"];

const newBD: Basicdata = {
    materialnumber: 0,
    type: "",
    materialclass: "",
};

Object.keys(newBD).map((key, index) => {
    newBD[key] = singleRow[index]
});

If not, you could make a class as others have said, or you can make a helper function likes this, if it would help with your use case.

const addProps = (arr) => {
    const newObj = {
        materialnumber: arr[0],
        type: arr[1],
        materialclass: arr[2],
    };

    return newObj
};

addProps(singleRow)

3 Comments

This looked like what I was searching for, but I get an error @ newBD[key] Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Basicdata'. No index signature with a parameter of type 'string' was found on type 'Basicdata'.ts(7053) So most likely classes are the way to go.
This isn't type-safe (notice the typescript tag), you'd need to do a lot of work to make this be type-safe, if it's even possible with this method
That helper function also sounds neat. Would upvote you, but I am missing reputation, so take my thank you instead.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.