What is the reason behind TypeScript failing to produce a type error when an object with excess properties is passed into a function?

Why does the code snippet below not result in a type error being thrown?

const fn1 = (arg1: { key: number }) => {
  console.log(arg1);
}

// This call works as expected
fn1({ key: 1 });

// However, this call does not produce a type error
fn1({ key: 1, a: 1 });

I've spent some time going through the TypeScript documentation and searching on Google but I'm still puzzled by this behavior!

Answer №1

In Typescript, errors are not thrown when the input type is a minimum requirement rather than a precise one. For instance, if you provide an object like { key: 1, a: 1 }, there will be no error because it includes the necessary key property.

However, if you omit the key property as in { a: 1 }, an error will be triggered since it does not meet the minimum requirement.

To enforce strict checking and trigger errors in such cases, consider using classes or interfaces instead.

class ExampleClass {
  constructor(readonly key: number) {}
}

interface ExampleInterface {
  key: number;
}

const fn1 = (arg1: ExampleClass | ExampleInterface) => {
  console.log(arg1);
}

// This will now result in a TypeScript error
fn1({ key: 1, a: 1 });

// But these examples won't trigger any errors
fn1(new ExampleClass(1));
fn1({ key: 1 });

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

Retrieve all records from the database using a Sequelize query that fall within the timeframe specified by the start

Currently, I'm attempting to retrieve data from a database using Sequelize, filtering for items that were created within a specific date range. Despite implementing the $between operator in my query, I'm facing difficulties as I'm not receiv ...

Unlocking the Power of Data Modelling in React and JavaScript

As a newcomer to React, I have been utilizing CRA in several production web apps. My background includes extensive work with Swift and familiarity with OOP concepts. Now, I am looking to incorporate models into my React projects. Here is an example of a s ...

Step-by-step guide: Setting up Typescript with npm on your local machine

I am trying to set up Typescript without any global dependencies. To do so, I have included the following in my package.json file: { "name": "foo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \" ...

What is the best way to assign the value of an HTTP GET request to a subarray in Angular 8

Attempting to store data in a sub-array (nested array) but despite receiving good response data, the values are not being pushed into the subarray. Instead, an empty array is returned. for (var j=0;j<this.imagesdataarray.length;j++){ this.http.g ...

Following the npm update, encountering errors with webpack

Upgrading the npm package to version 8.2.0 has caused issues in my React application. Here is a screenshot of the problem: https://i.stack.imgur.com/noQIz.png These are the error messages I see in the console: [HMR] Waiting for update signal from WDS.. ...

When attempting to parse a file name using a regular expression in TypeScript (or even plain Node.js), the unexpected outcome is a

Looking to extract language information from a filename? Check out this simple construct: The structure of my language.ts model is as follows: export interface Language { language?: string; region?: string; } The function designed for parsing the fi ...

Oops! Make sure to explicitly allow the dependency @types/html2canvas by adding it to the "allowedNonPeerDependencies" option

After installing the html2canvas package in my Angular library project, I encountered an error when compiling in production mode using the command ng build --prod. The specific error message is as follows: ERROR: Dependency @types/html2canvas must be exp ...

When utilizing the HTML5 range input type, the value of 'this.value' may not be defined

I'm having an issue with a range input where it returns undefined when passed to my function: Here is the HTML code snippet: <div class="slidecontainer"> <label>Setpoint</label> <p>{{channel.setPoint}}</p> & ...

Encountering ng build --prod errors following Angular2 to Angular4 upgrade

Upon completing the upgrade of my Angular2 project to Angular4 by executing the following command: npm install @angular/common@latest @angular/compiler@latest @angular/compiler-cli@latest @angular/core@latest @angular/forms@latest @angular/http@latest @an ...

Initiate the recalculation of the computed property

Currently, I am attempting to trigger an update in a computed property from my viewmodel to the UI. However, I am only able to retrieve the initial value and not any subsequent values. When trying to modify the property, it fails due to it not being recogn ...

Fastify Typescript: dealing with an unidentified body

I'm new to Fastify and I've encountered a problem with accessing values in the body using Typescript. Does anyone have any ideas or suggestions? Thanks! Update: I want to simplify my code and avoid using app.get(...) Here's my code snippet ...

Guide on inserting text fields or HTML content into a dropdown list using ng-multi-select in Angular 5

My current setup includes a multi-select drop-down with checkbox default. Now, I am looking to incorporate a text field next to the selected value. Initially, I attempted adding plain HTML code within quotes, but it did not yield the desired outcome. Then ...

Is it considered beneficial to use Observable as a static class member?

Lately, I have been diving into a new Angular project and noticed that the common way to share state between unrelated components is by using rxjs Subject/BehaviorSubject as static members within the class. For instance: export class AbcService { privat ...

Jest is unable to handle ESM local imports during resolution

I am encountering an issue with my Typescript project that contains two files, a.ts and b.ts. In a.ts, I have imported b.ts using the following syntax: import * from "./b.js" While this setup works smoothly with Typescript, Jest (using ts-jest) ...

React Native React Thunk activating upon the initial rendering of a component and every time a key is pressed in an input field

As a newcomer to react, react-native, react-redux, and react-thunk, I find myself facing a strange issue that is puzzling me. The sign-in component I have implemented uses a thunk for user authentication. I have mapDispatchToProps and applied it to the co ...

Encountering TypeScript errors while trying to implement Headless UI documentation

import { forwardRef } from 'react' import Link from 'next/link' import { Menu } from '@headlessui/react' const MyLink = forwardRef((props, ref) => { let { href, children, ...rest } = props return ( <Link href={href}&g ...

The 'routerLink' property cannot be bound because it is not recognized as a native property

I encountered an error while attempting to implement hashlocationstrategy. boot.ts ///<reference path="../typings/browser.d.ts"/> import { bootstrap } from "angular2/platform/browser"; import { RootComponent } from "./root.component"; import { ROUT ...

Collaborative Vue component: Clients need to manually import the CSS

I recently created a Vue component using TypeScript that resulted in a separate CSS file being generated after the build process. However, I noticed that when the client imports this component, the CSS file is not imported automatically and needs to be exp ...

Initial values of dual knob settings on Ionic Range and their ability to update dynamically

As someone new to using Ionic and TypeScript, I am facing challenges in setting initial values for my Ionic Range component (V5). Referring to other posts, it seems that there are upper and lower properties within ngModel, but I'm unsure about the bes ...

Steps for leveraging pdfMake with live data

Recently delving into Angular, I've been exploring the capabilities of pdfMake. While I successfully incorporated static data, I'm facing challenges when attempting to utilize dynamic data. Any guidance on how to achieve this would be greatly app ...