[Typescript] Хитрый интерфейс
30.10.2012
|
Pauel |
У Хейлсберга на видео есть вот такой интерфейс
Использовать можно вот так
Первые две строки вполне понятны, это перегрузка. Третье это нечто навроде свойства функции, использовать можно для разных целей, но не это интересно. Вопрос в том, как должен выглядеть класс, который реализует этот интерфейс.
Без свойства data все предельно просто, даже лишние скобочки не нужны:
А вот с data все интереснее:
Класс можно инстанцировать и передавать куда попало, но вообще желательно его инициализировать чем то отличным от undefined.
На codeplex и stackoverflow есть кое какие идеи (а уже мое "решение" ), но вобщем инфы маловато. Спецификация на typescript пока еще слабо похожа на спецификацию, скорее на декларацию намерений.
Для начала можно упростить задачу и реализовать нечто навроде
Обсуждения на codeplex и stackoverflow показывают, что это можно решить вот так
c перегрузкой все точно так же
Куда засунуть свойство data ? На codeplex есть примерно вот такой пример:
Фокус в том, что это не работает внутри класса, но работает как надо. То есть, компилер находит call signature. То есть, объект получается именно тот, что нужно.
В спецификации по языку ничего на этот счет нет, зато кое что есть на stacloveflow, в одном из примеров — <any>. Это вобщем приведение типа и использовать её можно как затычку куда попало. Странно, но почему то эта часть отсутствует в спецификации.
Итого:
Вобщем мне сильно кажется, что в компилере есть баг или же должен быть легальный способ безо всяких кастов.
interface X{
f:{
(s:string):string;
(s:number):string;
data:any;
};
}
Использовать можно вот так
function a(p:X) { return p.f("строка"); }
function a(p:X) { return p.f(1); //число }
function a(p:X) { return p.f.data.toString(); }
Первые две строки вполне понятны, это перегрузка. Третье это нечто навроде свойства функции, использовать можно для разных целей, но не это интересно. Вопрос в том, как должен выглядеть класс, который реализует этот интерфейс.
Без свойства data все предельно просто, даже лишние скобочки не нужны:
interface X{
f(s:string):string;
f(s:number):string;
}
class Y implements X{
f(s:string):string;
f(s:number):string;
f(s:any):string { /* обрабатываем оба случая */}
}
А вот с data все интереснее:
class Y implements X{
f:{
(s:string):string;
(s:number):string;
data:any;
};
}
Класс можно инстанцировать и передавать куда попало, но вообще желательно его инициализировать чем то отличным от undefined.
class Y implements X{
constructor() {
this.f.data = "data";
this.f. вот здесь самое интересное - как указать фукнцию, т.к. нужен объект с call signature.
}
f:{
(s:string):string;
(s:number):string;
data:any;
};
}
На codeplex и stackoverflow есть кое какие идеи (а уже мое "решение" ), но вобщем инфы маловато. Спецификация на typescript пока еще слабо похожа на спецификацию, скорее на декларацию намерений.
Для начала можно упростить задачу и реализовать нечто навроде
interface А{ ():string; }
Обсуждения на codeplex и stackoverflow показывают, что это можно решить вот так
a:A;
...
a = function() {retun ""}
c перегрузкой все точно так же
interface А{
():string;
(s:any):string;
}
.....
a:A;
...
a = function(s:any) {retun /* обработать два случая */}
Куда засунуть свойство data ? На codeplex есть примерно вот такой пример:
interface А{
():string;
ctx:any;
}
declare var x:A;
var x = function () {return "";}
x.ctx = something;
Фокус в том, что это не работает внутри класса, но работает как надо. То есть, компилер находит call signature. То есть, объект получается именно тот, что нужно.
В спецификации по языку ничего на этот счет нет, зато кое что есть на stacloveflow, в одном из примеров — <any>. Это вобщем приведение типа и использовать её можно как затычку куда попало. Странно, но почему то эта часть отсутствует в спецификации.
Итого:
constructor()
{
this.f = <{ (s:string):string; (s:number):string; data:any; }> function(s:any) {return /* обработать оба случая*/};
this.f.data = something;
}
Вобщем мне сильно кажется, что в компилере есть баг или же должен быть легальный способ безо всяких кастов.
30.10.2012 0 комментариев |