2017-02-22 12 views
0

Как бы вы достигли чего-то подобного в TypeScript?Наследование интерфейса, заданного как общий аргумент

interface Clonable<TAttributes> extends TAttributes { // ERROR: TAttributes is not an interface 
    clone(): TAttributes 
    copyFrom(input: TAttributes) 
} 

function(x : Clonable<{title:string,url:string}>) { 
    alert(x.title) // ERROR: title is not an property of x 
} 

Справочная информация: Я пытаюсь использовать TypeScript + Mithril + JSX. Чтобы мои атрибуты отображались при автозавершении, мне нужны атрибуты свойств с типами моих атрибутов; но я также хочу, чтобы мой класс имел эти атрибуты напрямую, потому что это намного короче, чтобы написать «this.title», чем «this.attributes.title».

Любой вариант здесь?

+0

Это не очень понятно, что вы просите. Вы спрашиваете о том, как его реализовать или как «набрать его»? (или оба..). Что это за безымянная функция? Что он должен делать? –

+0

Этот код недействителен. Вот две ошибки, которые он дает: - «Интерфейс может расширять только класс или другой интерфейс». at: '1,41' - 'Свойство' title 'не существует в типе' Clonable <{title: string; url: string; }> '' at: '7, 13' Я ищу альтернативный способ достижения этого, который сработает. – FremyCompany

+0

Очевидно, но что у вас есть? Реализованы ли «clone» и «cloneFrom»? Как бы вы это использовали? Пожалуйста, объясните, что у вас есть, и что вы хотите с ним делать. –

ответ

1

Вы можете использовать intersection type:

interface Clonable<TAttributes> { 
    clone(): TAttributes 
    copyFrom(input: TAttributes) 
} 

type AttributesClonable<TAttributes> = Clonable<TAttributes> & TAttributes; 

function doSomething(x : AttributesClonable<{title:string,url:string}>) { 
    alert(x.title); // fine now 
} 

(code in playground)

+0

Спасибо, ты рок! – FremyCompany

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

  • Нет связанных вопросов^_^