Unusual elective attributes found in TypeScript classes

Out of the blue, I started getting a ts2322 error with the code below. Everything was working fine in the Typescript playground.

I have reviewed it multiple times but can't seem to find any issues. What could be causing the problem?

The software version I'm using is Visual Studio Code 1.56.2

class Klass {
  value?: number;

  constructor(value?: number) {
    this.value = value;
  }
}

https://i.sstatic.net/OAstr.gif

Answer №1

It seems like you're working with the nightly builds of TypeScript published on npm under typescript@next. This might be giving you a sneak peek at a new feature in TypeScript 4.4 called "strict optional properties," which you can read more about here. (UPDATE 2021-06-10) Originally, this feature was going to be activated using the --strictOptionalProperties compiler flag within the --strict package of options. However, as mentioned in this comment, the flag will now have a different name and won't be part of --strict, requiring manual activation through another yet-to-be-named compiler flag.

This update introduces stricter rules around optional properties, disallowing the assignment of undefined to them but still permitting reading undefined from such properties. This aligns better with user expectations for optional properties, as demonstrated by the resolution of the long-standing issue microsoft/TypeScript#13195.

Consequently, it's now essential to verify that a value obtained from an optional parameter is not undefined before assigning it to an optional property of the same type, as illustrated below:

class Klass {
  value?: number;

  constructor(value?: number) {
    if (value !== undefined) this.value = value;
  }
}

Here's a helpful Playground link to code

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Changes in state cause React to unmount listed objects

In my React (TS) application, I have two components. App.tsx: import { useState } from 'react' import Number from './Number' import './App.css' function App() { const [list, setList] = useState(["1", "2", "3", "4"]); ...

An error occurred while trying to set the property 'IS_CHECK' of an object that is undefined

I'm attempting to create a checkbox that, when selected, should also select everything else. I followed the code example provided in this tutorial for angular 2. However, I encountered an error: "ERROR TypeError: Cannot set property 'IS_CHECK&ap ...

What are the steps to create custom Typescript RecursiveOmit and RecursivePick declarations for efficient cloning routines?

For some time now, I have been attempting to create a declaration for RecursiveOmit and RecursivePick in cloning methods such as JSON.parse(JSON.stringify(obj, ['myProperty'])) type RecursiveKey<T> = T extends object ? keyof T | RecursiveKe ...

React: Using useState and useEffect to dynamically gather a real-time collection of 10 items

When I type a keystroke, I want to retrieve 10 usernames. Currently, I only get a username back if it exactly matches a username in the jsonplaceholder list. For example, if I type "Karia", nothing shows up until I type "Karianne". What I'm looking f ...

Arranging React Grid Items with Stylish Overlapping Layout

Is there a way to create a react-grid-layout with 100 grid points width, while ensuring that the grid items do not overlap? https://i.sstatic.net/CQiVh.png (Reducing the number of columns can prevent overlap, but sacrifices the 100-point width resolution ...

The orbit controller in three.js seems to be malfunctioning when trying to navigate a static scene with an obj model

I'm having trouble with the orbit controller in my scene and here is the code I have: import * as THREE from 'three' import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' import { MTLLoader } from 'three/ex ...

A guide on integrating a vue-concurrency Task Creator with argument support

I've been grappling with my Vue 3 / TypeScript app and the vue-concurrency library. Everything is nearly in place, but configuring a Task Creator to accept arguments has proven to be quite challenging. Following the Task Creators pattern outlined in ...

The value binding for input elements in Angular 4 remains static and does not reflect changes in the UI

Struggling with binding input to a value in angular 4? Take for example [value]="inputFrom". Sometimes it updates when I change inputFrom, other times it doesn't. How can I ensure the input always changes whenever inputFrom changes, not sporadically? ...

Unusual actions observed in Ionic 3 app using webview 3 plugin

I am currently facing a significant problem with Webview 3. One of our developers upgraded it to webview 3 without utilizing the Ionic native webview plugin, and surprisingly, it is functioning well on our Ionic 3 application. As per the documentation avai ...

Enhancing React Flow to provide updated selection and hover functionality

After diving into react flow, I found it to be quite user-friendly. However, I've hit a roadblock while attempting to update the styles of a selected node. My current workaround involves using useState to modify the style object for a specific Id. Is ...

Must run the angular code in a sequential order

I need to run the code in a specific order; first the foreach loop should be executed, followed by a call to the getHistory() method. Your assistance is greatly appreciated. const execute = async()=>{ await this.currentContent.forEach(async ...

The predicate "adds" is applied to the type rather than substituting it

In my class, I am using a generic type to represent the known elements of its map, as shown below: abstract class Component { ... } class Test<Known extends Component[]> { components: Map<string, Component> ... has<C extends Compon ...

What is the best way to address (or disregard) a TypeScript error located within an HTML template?

I'm currently working on a VueJS-2 component with the following HTML template: <template> <div> <v-data-table :headers="headers" :items="items" :caption="label" dense hid ...

Updating a component in Angular 4.3.1 from within an observable callback

My Project Journey I am currently immersing myself in learning Angular by working on a personal project: developing a game that involves routing, services, and more. One of the requirements is to hide the header on the landing page (route for '/&apos ...

Exploring the distinctions between types and classes through type hinting

It seems that I am facing some challenges with this task and the reason is unclear to me switch (typeof request) { case 'EnrollmentRequest': The type '"EnrollmentRequest"' cannot be compared to the type '"string" | "number" | ...

How can I properly include DefinitelyTyped TypeScript definition files in a .NET Core project?

Previously, under asp.net for .net framework, I utilized NuGet to incorporate TypeScript type definitions from third-party libraries (*.d.ts files) provided by DefinitelyTyped. However, with the shift to .NET Core, it seems that NuGet is no longer recommen ...

What is the proper way to integrate helmet.js with typescript?

Utilizing helmet from pure JavaScript according to the documentation is quite straightforward: const express = require('express') const helmet = require('helmet') const app = express() app.use(helmet()) However, I'm unsure how ...

Guide to managing MUI's theme typography font weight choices with TypeScript

I am interested in learning how to incorporate a new font weight into my theme, for example, fontWeightSemiBold, and disable the existing fontWeightLight and fontWeightMedium. I believe this can be achieved through module augmentation. For reference, there ...

The art of gracefully defining universal types in TypeScript

In the scenario where I have a type type myObject = object; and want it to be accessible globally across all modules transpiled with tsc, is there a graceful method to define a global type alias in TypeScript? ...

"Experience the power of utilizing TypeScript with the seamless compatibility provided by the

I'm attempting to utilize jsymal.safeDump(somedata). So far, I've executed npm install --save-dev @types/js-yaml I've also configured my tsconfig file as: { "compilerOptions": { "types": [ "cypress" ...