Расширить интерфейс, определенный в файле .d.ts
В моем проекте TypeScript я использую DefinitelyTyped определения для внешних js-зависимостей.
Иногда бывает так, что эти определения устарели. Это может случиться и с некоторыми библиотеками, которые могут добавлять новые методы во время выполнения, например express-validator, в которых вы можете определить пользовательские функции проверки достоверности.
Поэтому я хотел бы расширить те определения .d.ts
, добавляющие новые методы и/или свойства.
Итак, если у меня есть определенная определенность в express-validator.d.ts
:
declare module ExpressValidator {
export interface Validator {
is(): Validator;
not(): Validator;
isEmail(): Validator;
...
}
}
как я могу расширить интерфейс Validator
внутри, например, my application.ts
?
///<reference path='../typings/tsd.d.ts' />
import expressValidator = require('express-validator');
export var app = express();
app.use(expressValidator({
customValidators: {
isArray: function(value) {
return Array.isArray(value);
}
}
}));
// How to extend Validator interface adding isArray() method??
Ответы
Ответ 1
//Как расширить интерфейс Validator с помощью метода isArray()
Вы не можете сделать это в файле, который является модулем (некоторые рекомендации здесь), и ваш файл является модулем, потому что у вас есть import expressValidator
.
Вместо этого создайте extendedValidator.d.ts
и добавьте новый материал для механизма TypeScript:
declare module ExpressValidator {
export interface Validator {
isArray: any;
}
}
Ответ 2
Я смог сделать это, следуя инструкциям на https://www.credera.com/blog/technology-solutions/typescript-adding-custom-type-definitions-for-existing-libraries/. Там они используют пример react
.
import 'react';
declare module 'react' {
interface OlHTMLAttributes<T> {
type?: "1" | "a" | "A" | "i" | "I";
}
}'''
I found this works really well for 'winston' too.