2016-10-04 3 views
2

Я установил определения knockout, используя документированный метод, подобный этому.Как расширить интерфейс, объявленный во внешней библиотеке d.ts?

npm install @types/knockout 

Это работает красиво, я могу импортировать его вот так в любом месте.

import * as ko from "knockout"; 

Однако, я застрял с расширением KnockoutStatic интерфейса с некоторыми пользовательскими вещами. Я пытаюсь выполнить миграцию <reference ... /> и namespace на основе огромного приложения TS для использования модулей. Раньше я легко объявлял интерфейс расширения в любом месте, и декларации были объединены. Скажем, мое расширение выглядит так.

interface KnockoutStatic { 
    doSomething(): void; 
} 

Я попытался создать KnockoutExtensions.d.ts файл, в котором я объявил его, как это.

import "knockout"; 

declare module "knockout" { 
    export interface KnockoutStatic { 
    doSomething(): void; 
    } 
} 

Но когда я импортировать как knockout и мое расширение где-то, TS до сих пор не может решить doSomething вызов.

import * as ko from "knockout"; 
import "./KnockoutExtensions"; 

ko.doSomething(); // error 

Что такое правильный способ расширения библиотеки интерфейсов с использованием машинописи 2.0 и новая d.ts подсистемы?

Я использую Visual Studio 2015 Update 3 с установленным TypeScript 2.0.

ответ

0

Вам необходимо создать свой интерфейс за пределами вашего модуля. Do не объявить его с экспортом.

module example { //...do stuff }

interface KnockoutStatic { doSomething(): void; }

Вы можете на файл, в котором вы добавляете свои расширения интерфейса, чтобы держать его в чистоте.

+0

Это не сработало, это сработало только тогда, когда я не использовал модули, а чистые пространства имен. –

0

Проблема заключается в том, что для ввода файла knockout используется синтаксис export =, и это не «дружественный к дополнению». См. this в качестве ссылки.

Простейшим решением для меня было обертывание расширений в declare global { }, так как knockout печатающий файл объявляет все в глобальном масштабе.

declare global { 
    interface KnockoutStatic { 
    doSomething(): void; 
    } 
} 
0

Вы можете легко расширить «нокаут» или любое другое пространство имен TypeScript.

Пример: создать нокаут-extension.d.ts файл

/// <reference path="<path-to-typings-dir>/knockout/index.d.ts" /> 

declare module 'knockout' { 

    export interface CustomType { 

    customField: string; 

    customMethod(arg1: number, arg2: boolean): boolean; 
    } 

    namespace customNamespace { 

    export interface AnotherCustomType { 
     customField1: string; 
     customField2: boolean; 
    } 
    } 

    // NOTE: extending existing interface 
    export interface KnockoutStatic { 
    customMethod(): void; 
    } 
} 

Примечание: убедитесь, что этот файл снимаемого по машинописи компилятором.

Используйте новые типы из расширенного модуля.

// one way 
import { CustomType } from 'knockout'; 

const foo: CustomType; 

// second way 
import * as kc from 'knockout'; 

const foo: kc.CustomType; 
const bar: kc.customNamespace.AnotherCustomType; 

Для получения дополнительной информации о модулях и пространствах имен вы можете проверить машинопись документацию на Modules и Namespaces и их together использовании.

Cheers!

Смежные вопросы