Как включить выходные параметры в функцию с помощью Typescript?

Можно ли включать выходные параметры в функцию с помощью TypeScript? Что-то вроде Func1(string val1, int out k1, int out k2) в С#.

Ответ 1

В настоящее время нет.

Вы можете вернуть объект, который может содержать более одного свойства.

return { k1: 5, k2: 99 };

Ответ 2

Как правило, вы просто возвращаете объект с несколькими свойствами, один из которых содержит вашу функцию. Что-то вроде этого:

var foo = function (val1 : string){
    // do something

    return {
        k1: 22,
        k2: 33
    };
}

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

interface IFoo {
    (val1: string): INumbers;
}
interface INumbers {
    k1 : number;
    k2 : number;
}

var foo : IFoo = (val1 : string){
    // do something

    return {
        k1: 22,
        k2: 33
    };
}

Ответ 3

Typescript передает все параметры с помощью "вызова по значению". Но если параметр является ссылкой, он ведет себя так же, как "вызов по ссылке" большую часть времени. Вы можете писать классы-оболочки для примитивных типов. Вот код:

var func=function(param:Str){
    param.str="modified";
}
class Str{
    str:string="unmodified";
}
var test:Str=new Str();
alert(test.str); //alerts "unmodified"
func(test);
alert(test.str); //alerts "modified"

Вам нужно быть осторожным:

var func=function(param:Str){
    param=new Str("modified");
}
class Str{
    str:string;
    constructor(param:string){
        this.str=param;
    }
}

var test:Str=new Str("unmodified");
alert(test.str); //alerts "unmodified"
func(test);
alert(test.str); //alerts "unmodified"

Параметр функции передается "вызов по значению". Поэтому внутри тела функции вы работаете с копией ссылки. Эта ссылка указывает на тот же объект, что и ссылка, которую вы передали в качестве параметра, чтобы вы могли получить доступ к своим членам и изменить их. Но если вы назначаете новый объект ссылке, все новые изменения применяются к этому новому объекту. Поэтому вышеприведенный код дважды печатает немодифицированные данные. Я думаю, что С# тоже работает так.

Ответ 4

Если вы действительно хотите иметь выходной параметр, даже если вы можете вернуть объект или массив (как временный объект кортежа), посмотрите на foo и сайт вызова foo...

function p(s) {
  document.body.appendChild(document.createTextNode(s));
  document.body.appendChild(document.createElement('BR'));
}
function foo(output: any): void {
  output.uno = 1;
  output.dos = 2;
}
var o: any = {};
function foo(o);
p(o.uno + " " + o.dos);

Ответ 5

Если вы хотите использовать синтаксис типа С#, который вы можете использовать:

function func(val1, k1, k2)
{
    k1.v = 7;
    k2.v = 9;
    return "";
}

и называть его

func("", {}, {});   

Ответ 6

Иногда параметр undefined, и вам нужно создать его внутри метода. В этом случае вы можете использовать "лямбда-функции" или "функции стрелок" и имитировать выходной параметр следующим образом:

Пример:

class classA
{
   propertyA : number;
   constructor(value: number){
        propertyA = number;
   }
}

class classB {

    // ...

    exampleMethod(){
       let classAInstance: classA;
       this.sumValueMethod((p) => classAInstance = p, 10);

       if(classAInstance != undefined)
           alert("Yeah"); 
    }

    sumValueMethod(paramA:(p: classA) => any, paramB: number){

       let variableA: classA = new classA(0);
       variableA.propertyA += paramB;

       paramA(variableA);
    }
}

Ответ 7

Здесь другой путь. Определите функцию обратного вызова, которая будет включать ваши параметры:

function Func1(val1: string, out: (k1: number, k2: number) => void): void {
    out(1, 2);
}

Пример того, как его использовать:

function anotherFunction(): void {

    let k1: number;
    let k2: number;

    Func1("something", (v1, v2) => {
        k1 = v1;
        k2 = v2;
    });

    console.log(k1); // output: 1
    console.log(k2); // output: 2
}

Я нахожу его в основном полезным для таких вещей:

const keys: string[] = [];
const values: number[] = [];

function tryGet(key: string, out: (value: number) => void): void {
    const index = keys.indexOf(key);
    if (index >= 0) {
        out(values[index]);
    }
}

function test(): void {

    const key = "myValue";

    tryGet(key, (value) => {
        console.log(`Key '${key}' exist with value ${value}`);
    });
}