Тип проверки JavaScript для свойств объекта, которые меняют тип

С этим https://code.visualstudio.com/docs/nodejs/working-with-javascript#_type-checking-javascript включен в настройках, есть некоторые объекты с допустимыми изменениями типа.

Примеры:

let options = {
        logging: false,
    }    
if (process.env.DEBUG_LOG == "true") {
        options.logging = console.info // vscode error: is not assignable to boolean
    }    

или

 let pgconfig = {
        ssl: { rejectUnauthorized: false },
        max: 5,
    }
if (process.env.NODE_ENV == 'development') {
        //no SSL on localhost
        pgconfig.ssl = false // vscode error
    }

Эти изменения типа действительны для функций, использующих их.

Как заставить vscode понять, что оба работают, не используя

// @ts-ignore comment on the line before the error:

Это файл .js, а не .ts. Я попытался

let options = {
        logging: <any> false,
    } 

or
let options = {
        logging: false as any,
    } 

но они не работают в JS.

Дополнительная информация: https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html (не говоря о том, как обрабатывать изменения типа)

Можете ли вы просто переименовать файл в .ts, чтобы вы могли использовать аннотации типов TypeScript для руководства компилятором?

Thomas 17.03.2022 09:47

Спасибо. Я пытался, но вводит другие ошибки, например, на import file from './file.ts' Я думаю, // @ts-ignore это единственное решение для JS в этом случае?

Marius 17.03.2022 10:39

Просто догадываюсь: может быть, вы могли бы сделать let options = {}; options.logging = false;? (См. Литералы параметров являются открытыми.)

Thomas 17.03.2022 17:00

А, и в этом же разделе я вижу, что JSDoc тоже парсится. Таким образом, вы также можете использовать это как замену аннотациям типов!

Thomas 17.03.2022 17:01

Оба ваших последних варианта работают :) Спасибо, Томас! Я пошел с JSDoc. Не могли бы вы опубликовать это как ответ?

Marius 18.03.2022 07:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Начиная с литералы опций открыты, вы можете заставить компилятор получить тип any для поля, назначив поле после создания объекта:

let options = {};
options.logging = false;

Альтернативой является использование JSDoc для добавления @type тег, что позволяет вам быть немного более строгим, чем тип any:

/** @type {{logging: (boolean|function(...*))}} */
let options = {
    logging: false,
}

(Надеюсь, я правильно понял этот синтаксис, но я его не проверял. См. также Типы в системе типов закрытия.)

Другие вопросы по теме