it-swarm.asia

توقيعات نوع TypeScript للوظائف ذات الصلة

أواجه مشكلة في تحديد واجهات أعضاء الوظيفة الذين يقبلون كميات متغيرة من الوسائط. خذ الكائن التالي الحرفي كمثال:

var obj = {
    func: () => {
        for(var i = 0; i < arguments.length; i++) {
            console.log(arguments[i]);
        }
    }
};

أود أن أكون قادرًا على تحديد واجهة مثل:

interface IExample {
    func: ( ??? ) => void;
}

بحيث يمكن ترجمة التعليمات البرمجية التالية دون خطأ:

var test = (o: IExample) {
    o.func("a");
    o.func("a", "b");
    o.func("a", "b", "c");
    ...
}
86
nxn

يستخدم TypeScript اقتراح انتشار ECMAScript 6 ،

http://wiki.ecmascript.org/doku.php؟id=harmony:spread

ولكنه يضيف التعليقات التوضيحية للنوع بحيث يبدو هذا ،

interface Example {
    func(...args: any[]): void;
}
160
chuckj

فقط للإضافة إلى إجابة تشاك ، لا تحتاج إلى تحديد واجهة على هذا النحو. يمكنك فقط تنفيذ ... مباشرة في الطريقة:

class Header { constructor(public name: string, public value: string) {} }

getHeaders(...additionalHeaders: Header[]): HttpHeaders {
    let headers = new HttpHeaders();
    headers.append('Content-Type', 'application/json')

    if (additionalHeaders && additionalHeaders.length)
        for (var header of additionalHeaders)
            headers.append(header.name, header.value);

    return headers;
}

ثم يمكنك أن تسميها:

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()))

أو

headers: this.getHeaders(new Header('X-Auth-Token', this.getToken()), new Header('Something', "Else"))
4
Serj Sagan

إذا لم يتم استخدام الوسيطة args [] ، فسيظل TypeScript ينشئ صفيفًا في Javascript ويقوم بنسخ الوسائط إليه.

لتجنب هذا عدم الضرورة ، يمكنك عمل نموذج أولي للوظيفة بالإضافة إلى الوظيفة ، وبالتالي: -

function format_n(str: string, ... $n: any[]): string;
function format_n(str: string): string {
    return str.replace(/%(\d+)/g, (_, n) => format_n.arguments[n]);
}
0
Quentin 2