6

When I have an object which has nested optional fields, like:

type FormState = {
  aaa?: {
    bbb?: {
      ccc?: number
    }
  }
}

When I want to set value to aaa.bbb.ccc in typescript, I have to:

import produce from "immer";

const formState: FormState = {}

const target = produce(formState, draft => {
  draft.aaa = draft.aaa ?? {}
  draft.aaa.bbb = draft.aaa.bbb ?? {}
  draft.aaa.bbb.ccc = 1;
})

Is there any way to make it simpler?

The optional chaining syntax isn't work here:

draft?.aaa?.bbb?.ccc = 1;  // compilation error

A small demo: https://github.com/freewind-demos/typescript-immer-set-value-to-nested-optional-fields-demo

Linda Paiste
  • 38,446
  • 6
  • 64
  • 102
Freewind
  • 193,756
  • 157
  • 432
  • 708
  • You can make it shorter, but I would argue not simpler [Playground Link](https://www.typescriptlang.org/play?#code/C4TwDgpgBAYg9gJwLYGVgENjQLxQN4BQUU6pA-AFz5HFQBGDl1ttAxu0wHYCuSdECGsQC+NUaIKs4nAM7AoAM0SoMWKvGRpMOfMIDcBSdLlQMCAOYR5uMAjgATbqwgAKJZtUQANFBd4SpFT+DHRBUOysULgAjFDCUbpxCXjxwgCUUQB8zFAIVtwInPgB6GEhYRFJqQbpRrJwADYQAHQNcOYuZpbAaQZS9U2t7Z3oFlbNpOjNIc0RvYYECtycrMAAltJQtg5Oru4q2urKWlg+22DcDYe+9gjoCsBHHtoZ2NkAIhAQYABKEACO3DWeXsAB4NAcsJkMoRiHlgAUiudLto3MdPPMJKBIFBPt8-oDgRAwQAVbK4fwAbQAClA1kUANYQEBwBRQEkAXQAtEw8b8AUCQaCSTSOdlhEA) it does validate that you initialize everything declared. – Aluan Haddad Sep 13 '20 at 09:13
  • This is better I think [Playground](https://www.typescriptlang.org/play?#code/C4TwDgpgBAYg9gJwLYGVgENjQLxQN4BQUU6pA-AFz5HFQBGDl1ttAxu0wHYCuSdECGsQC+NUaIKs4nAM7AoAM0SoMWKvGRpMOfMIDcBSdLlQMCAOYR5uMAjgATbqwgAKJZtUQANFHsJ0CtYAfMxQCFbcCJz4JKRUeFAAdMl+AcCJpOg+DHTxUOysVACMPsmJqYEZ5Ik5UMJ1DWRkugbCAJRGsnAANhCJ3XDmLmaWwG0GUl29-YPD6BZWVeg1DIkF44YECtycrMAAltJQtg5Oru4q2urKWlg+J2Dc3VdQLhXA1x7abVDYIQAiEAgYAAShAAI7cfbhewAHg0lywQR+hGI4WAkWiDye2jcN08GwkoEgUEBwLBkOhEDhABUQrgEgBtAAKUH20QA1hAQHAFFAaQBdAC0TDJoIhUJhsJpLIFIWEQA) – Aluan Haddad Sep 13 '20 at 09:19

0 Answers0