Я хотел создать новый 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.
Могу ли я безопасно игнорировать эту ошибку и использовать этот код в производстве?
Для этого вы должны создать файл объявления 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
.
какой должен быть тсконфиг? Я делаю это, но все равно получаю ошибку
Вы можете сделать это, но создайте файл javascript для хранения этой функции и файл объявления для объявления функции как класса, тогда машинописный текст не выдаст ошибку