2013-10-08 5 views
0

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

В javascript вы можете написать функцию, которая возвращает объект со свойствами и методами, добавленными динамически.

Например (просто пример):

function fn(val) { 
    var ret = {}; 

    if (val == 1) { 
     ret.prop1 = "stackoverflow"; 
     ret.fn1 = function() { 
      alert("hello stackoverflow"); 
     } 
    } 

    if (val == 2) { 
     ret.fn2 = function() { 
      alert("val=2"); 
     } 
    } 

    return ret; 

}

window.onload = функция() {

alert(fn(1).prop1); //alert "stackoverflow" 
    fn(1).fn1(); //alert "hello stackoverflow" 

    fn(2).fn2(); //alert "val=2" 

}

В визуальной студии INTELLISENSE распознает возвращаемое значение функции и позволяет использовать параметры и функции.

enter image description here

enter image description here

В первом изображении есть "prop1" и "fn1()", а не "Fn2()"

Во втором изображении есть «Fn2() », а не« prop1 »и« fn1() ».

вы можете сделать что-то подобное с машинописным текстом? Как?

Идея состоит в том, чтобы иметь одну или несколько функций, возвращающих объекты со свойствами и методами, динамически добавленные на основе параметров, переданных функции и видимых из визуальной студии intellisense.

благодаря

Лука

ответ

0

машинопись интерфейсы могут иметь дополнительные элементы. например :

interface Foo{ 
    prop1?:string; 
    fn1?:Function; 
    fn2?:Function; 
} 
function fn(val):Foo { 
    var ret:Foo = {}; 

    if (val == 1) { 
     ret.prop1 = "stackoverflow"; 
     ret.fn1 = function() { 
      alert("hello stackoverflow"); 
     } 
    } 

    if (val == 2) { 
     ret.fn2 = function() { 
      alert("val=2"); 
     } 
    } 

    return ret; 
} 

Вам не нужно создавать явный интерфейс. Вы можете сделать это рядным:

function fn(val) { 
    var ret:{ 
     prop1?:string; 
     fn1?:Function; 
     fn2?:Function; 
    }= {}; 

    if (val == 1) { 
     ret.prop1 = "stackoverflow"; 
     ret.fn1 = function() { 
      alert("hello stackoverflow"); 
     } 
    } 

    if (val == 2) { 
     ret.fn2 = function() { 
      alert("val=2"); 
     } 
    } 

    return ret; 
} 
+0

благодарит за ответ. Если я пишу: п (1) визуальная студия IntelliSense не появляется становится неудобно использовать «Fn» Лука – LucaDev

+0

Попробуйте сохранить результат п (1) к переменной и посмотреть, если IntelliSense возвращается живым , –

+0

Спасибо Алекс. Это верно. Если я вызываю fn с 1 подобным параметром, я вижу все свойство и все методы (prop1, fn1 и fn2) Возможно, есть функция, которая возвращает объект, который имеет свойства и методы, добавленные динамически во время выполнения, а не интерфейс со всеми свойствами и методы? – LucaDev

0

Overload on constants (scroll down here) предназначен для этого случая использования, но в моем тестировании, я мог получить только, чтобы работать со строками, а не с числами.

Ниже приведен вариант (с использованием строк) на вашем примере:

interface Type1 { 
    fn1(): void; 
    prop1: string; 
} 

interface Type2 { 
    fn2(): void; 
} 

function fn(val: string): Object; 
function fn(val: "1"): Type1; 
function fn(val: "2"): Type2; 
function fn(val: string): Object { 
    var ret: any = {}; 
    if (val == "1") { 
    ret.prop1 = "stackoverflow"; 
    ret.fn1 = function() { 
     alert("hello stackoverflow"); 
    } 
    } 
    if (val == "2") { 
    ret.fn2 = function() { 
     alert("val=2"); 
    } 
    } 
    return ret; 
} 

console.log(fn("1").fn1); 
console.log(fn("1").prop1); 
console.log(fn("2").fn2); 
// Bad: console.log(fn("2").fn1); 
// Error: The property 'fn1' does not exist on value of type 'Type2'. 

В быстром поиске, я не мог найти обсуждение чисел для этой функции. Строки, вероятно, являются наиболее распространенным случаем использования, но иногда я мог видеть, что цифры пригодились. Если бы я был потрясающе, я бы raise an issue here.

+0

Спасибо Tom за ответ. Ваш пример похож на пример basarat и основан на интерфейсах, но работает только с параметрами типа String. Невозможно написать функцию, которая возвращает объект со свойствами и методами, добавленными во время выполнения как Javascript (без интерфейса) и использующим возвращаемое значение, является ограничением. «Начинается с JavaScript, заканчивается JavaScript», но он не делает то, что делает javascript. Я не эксперт по JavaScript или машинопись, поэтому мое мнение скромное и скромное. Надеюсь, вы исправите меня и скажете, что я сделал неправильно. Спасибо и извините за «плохой английский» .Luca – LucaDev

+0

Это не так, как пример басарата. Обратите внимание на разные типы возвращаемых значений для разных значений аргументов. К сожалению, да, это просто для струн. –

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