2017-02-16 15 views
0

В настоящее время я пытаюсь использовать псевдоним обобщенного класса. Я использую пакет typescript-collections и хочу переименовать.Typcript Alias ​​Instance обобщенного класса

class Bar<T> {} 
class Foo = Bar<X>; 

Как бы мне заняться второй линией?

+1

Что вы пытаетесь выполнить на 2-й строке? Как вы могли бы использовать «Foo»? –

+0

Я планирую просто заменить 'Bar ' '' Foo' всюду, я его вижу. 'Bar ' - очень длинное имя, которое исходит из пакета typescript-collections, а 'Foo' - гораздо более содержательное имя. – iHowell

+1

вы можете просто сделать тип Foo = Bar ; но я не уверен, какая цель будет служить. Помимо псевдонима типа в некоторых местах .. вы не можете использовать тип для создания новых объектов, например, используйте его только как псевдоним типа. – toskv

ответ

2

Если все, что вам нужно, это псевдоним Bar<X> в аннотации типа/подсказки в других местах (например, function blah(foo: Bar<X>).), Вы можете использовать следующее заявление:

type Foo = Bar<X>; 

Обратите внимание, что вы все еще не можете сделать new Foo(), в Оператор type вносит вклад в раздел «типы» TypeScript, а не в «значения» (например, класс).

Если вы хотите реальный класс, простое и эффективное решение было бы продлить первоначальный Bar<X> класс следующим образом:

class Foo extends Bar<X> {} 

Я, лично, не особенно нравится это решение, хотя, как это делает ваш код менее ясен.

+0

Есть ли способ сделать вторую часть, хотя и не просто получить информацию о типе? – iHowell

+1

Отредактировано. Опять же, мне это не особенно нравится. Наследование OO не должно использоваться для псевдонимов. –

1

Вы можете наследовать Foo от Bar<X> сделать класс с параметром X типа предопределенного:

class Foo extends Bar<X> {} 
1

Вы можете использовать псевдоним типа, как @toskv предложил:

type Foo = Bar<X>; 

Затем вы можете использовать это как тип:

let foo: Foo = new Bar<X>(); 

Если вы будете иметь конструктор, который принимает экземпляр X, то компилятор будет определить тип:

class Bar<T> { 
    constructor(x: X) { } 
} 

let foo: Foo = new Bar(); 

Если вы хотите новый класс, который связан с конкретным родовым ограничения, то вам нужно сделать что-то вроде:

class Foo extends Bar<X> { ... } 

let foo = new Foo(); 
1

Если все, что вам нужно, это тип псевдонима, то вы можете использовать тип, чтобы создать его таким образом:

type Foo = Bar<X>; 

При этом вы сможете делать такие вещи, как:

let x: Foo; 

Но нет:

let x= new Foo(); 

Другим решением было бы просто расширить бар и сделать пустой класс. На самом деле не так, как вы должны использовать иерархии классов, но он делает то, что вам нужно.

class Foos extends Bar<number> { } 

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

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