2014-12-09 1 views
1

Я пытаюсь создать файл определения TypeScript для этой реализации String.format for JavaScript, но я боюсь.Как создать файл описания TypeScript для внешнего javascript, который добавляет методы в String

Я все еще новичок в TypeScript, и я прочитал много статей/фрагментов о том, как создавать определения. Один из лучших ресурсов, который я нашел, - это статья Стива Фентона в блоге Complex TypeScript Definitions Made Easy. Я следовал предложенным примерам, но до сих пор не увенчался успехом.

Проблема в том, что внешний Javascript добавляет метод к «String». Я пытался «объявить» класс String, следующим образом:

declare class String { 
    declare function format(str: string, obj0: any, obj1?: any, obj2?: any): string; 
} 

Это приводит к ошибке: Duplicate identifier 'String'

Я также попытался описать информацию типа с помощью интерфейса:

interface String { 
    format(str: string, obj0: any, obj1?: any, obj2?: any): string; 
} 

сам интерфейс кажется нормально, но если я пытаюсь позвонить:

String.format("The {0} brown {1}!", "quick", "fox") 

Я получаю ошибку The property 'format' does not exist on value of type '{ prototype: String; fromCharCode(...codes: number[]): string; (value?: any): string; new(value?: any): String; }'.

Я предполагаю, что это связано с тем, что format - это статический метод (в терминах TypeScript в любом случае), но он определен как метод экземпляра на интерфейсе (поскольку интерфейсы не могут содержать определения статических методов).

Возможно, я вхожу в совершенно неправильное направление с этим или может иметь совершенно ошибочное понимание какого-либо элемента Javascript, TypeScript или обоих. Может ли кто-нибудь хотя бы подтолкнуть меня в правильном направлении, пожалуйста?

+0

Я использую машинопись. См. Эту ссылку. Http: // StackOverflow.com/questions/20070158/string-format-not-work-in-typescrypt/35163695 # 35163695 – seven

ответ

0

В настоящее время я не думаю, что существует способ, потому что String определяется следующим образом и declare var не сливается с другими типами.

declare var String: { 
    new (value?: any): String; 
    (value?: any): string; 
    prototype: String; 
    fromCharCode(...codes: number[]): string; 
} 

В последней машинописи github она определяется с declare var String: StringConstructor, который является расширяемым. Так что в следующей версии вы можете сделать:

interface StringConstructor{ 
    format(str: string, obj0: any, obj1?: any, obj2?: any): string; 
} 

Я понимаю, что это не ответ вы надеетесь, но я думаю, что вы должны ждать следующей версии, чтобы исправить это.

Offcourse Вы можете использовать его сейчас, отправив его, например, any.

редактировать После комментария снизу

Теперь это возможно с версией текущей машинописи (1,3)

Это даст вам некоторую безопасность, литой слишком customstring не выглядит очень хорошо, но он дает вам некоторую безопасность во время компиляции, и он по-прежнему будет ловить ошибки при неправильном вводе format (например, frmat).

interface CustomString { 
    format(str: string, obj0: any, obj1?: any, obj2?: any): string; 
} 
var foo = "foo"; 
var ret = (<CustomString><any>foo).format("bar", "baz"); 
+0

Спасибо за ваш ответ, я ценю это. Вы не могли просто подробно рассказать о своем последнем комментарии еще немного, пожалуйста, пожалуйста? Что бы я сделал для «любого»? –

+0

Добавил мой ответ с информацией о листе :) –

+0

Спасибо! Я добавил интерфейс, который вы предложили выше, в файл определения и изменил свой код начертаний на: '( String) .format (" {0} коричневый {1} "," быстрый "," лиса "); ' Это не идеально (как вы говорите), но это не слишком уродливо. Это, безусловно, будет делать до следующей версии TypeScript. –