Класс TypeScript расширяет функцию JavaScript

Я хотел создать новый class, расширяющий существующий классовый JavaScript function.

function MyFunctionClass() { }

MyFunctionClass.prototype.myMethod = function(str) {
  console.info(str);
};

Я написал этот простой фрагмент кода

class Test extends MyFunctionClass {
    constructor() {
        super();
    }
}

let t = new Test();
t.myMethod('Test');

И, что удивительно, он работает, так как печатает Test и никаких ошибок во время выполнения не возникает.
Однако игровая площадка TypeScript говорит мне

Type '() => void' is not a constructor function type.

Могу ли я безопасно игнорировать эту ошибку и использовать этот код в производстве?

Вы можете сделать это, но создайте файл javascript для хранения этой функции и файл объявления для объявления функции как класса, тогда машинописный текст не выдаст ошибку

Shridhar Sharma 27.05.2019 18:05
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
2
1
539
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Для этого вы должны создать файл объявления TypeScript (mumble.d.ts), чтобы предоставить TypeScript информацию о классе, например:

// In a .d.ts file associated with the project
declare class MyFunctionClass {
  myMethod(str: string): void;
}

Таким образом, TypeScript не только знает, что MyFunctionClass — это класс, но также знает, что myMethod ожидает строку и не имеет возвращаемого значения.

And surprisingly it does work...

Это не удивительно. :-) Помните, что TypeScript компилируется в JavaScript. Если вы ориентируетесь на ES5, конструкция TypeScript class компилируется в функцию-конструктор JavaScript и связанный с ней прототип, который TypeScript может подключить в отношениях наследования с JavaScript MyFunctionClass. Если вы ориентируетесь на ES2015+, TypeScript class компилируется в ES2015+ class, а ES2015+ class может использовать функцию-конструктор в стиле ES5 в предложении extends.

какой должен быть тсконфиг? Я делаю это, но все равно получаю ошибку

canbax 17.03.2022 10:37

@canbax - Если файл numble.d.ts находится рядом с другими вашими файлами .ts, по моему опыту, он просто подхватывается. Это описано здесь. Этот также может быть полезен. Поэтому я думаю, вам просто нужно убедиться, что TypeScript включает файл .d.ts.

T.J. Crowder 17.03.2022 10:49

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