使用函数重载时在实现中使用哪种类型? (并且没有隐含的任何)

时间:2017-05-16 11:58:05

标签: typescript

请记住noImplicitAny已开启。

有一个重载函数的简单示例:

interface FUNC {
    (x: number, f: (y: number) => number): number;
    (x: string, f: (y: string) => string ): string;
}

const func: FUNC = function(x, func) {
    return func(x);
}

const result = func('dfd', x => x + '3');

您将获得xfunc隐式拥有任何类型。 (使用this link并打开" noImplicitAny"看看它

您会给xfunc哪种类型? (现在我给他们明确了,我认为那里有一个更好的解决方案,也许我错了)

提前致谢!!

3 个答案:

答案 0 :(得分:1)

您可以使用泛型:

const func: FUNC = function<T>(x: T, func: (x: T) => T) {
    return func(x);
}

答案 1 :(得分:0)

如果func仅接受数字和字符串,则应为其提供联合类型:

x: number | string

答案 2 :(得分:0)

如果您的重载仅因类型而异,则可以修改您的接口以获得泛型类型参数:

interface FUNC<T> {
    (x: T, f: (y: T) => T): T;
}

并使用它:

// Parameter types will be inferred based on type parameter.
const numberFunc: FUNC<number> = function(x, func) {
    return func(x);
}

const stringFunc: FUNC<string> = function(x, func) {
    return func(x);
}
const numberResult = numberFunc(1, x => x + 1); // Can't pass strings here
const stringResult = stringFunc("1", x => x + "1"); // Can't pass numbers here