Search code examples
javascriptangulartypescriptecmascript-2016

How to deconstruct an object and exclude a property?


I want to deconstruct an object and exclude a property.

This is what I'm doing right now:

 let x = {a:1, b:2, c:3};
 let y = {...x};
 delete y.c;
 store.setState(y);

I found an article about ES7 which states there is a new feature to exclude properties. So the above would be written like this:

 let x = {a:1, b:2, c:3};
 store.setState({c, ...x});

https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90

The above doesn't work in Angular 7 and I get the following error:

error TS2663: Cannot find name 'c'. Did you mean the instance member 'this.c'?

I'm currently running TypeScript 3.1.6, and my tsconfig.app.json file looks like this.

{
    "extends": "../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "module": "es2015",
        "types": []
    },
    "exclude": [
        "src/test.ts",
        "**/*.spec.ts"
    ]
}

Here is the parent file.

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "importHelpers": true,
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ]
  }
}

Now I think the issue is that the line "lib": ["es2017"] is for ES6.

What can I do to enable this ES7 feature and will it break targeting ES5 as the compiled output from TypeScript?


Solution

  • Simply update your line - let y = {c, ...x}; with const {c, ...noC} = x;. So your code would be -

    const x = {a:1, b:2, c:3};
    const {c, ...noC} = x;
    
    console.log(noC);

    Suggestion: It's a good practice to make x constant, if you are not going to update it later.