2

考虑以下函数。

public static convert<T, U>(t: T, conversion: ((toutput: T) => U) = ((t) => toutput)) { 
    return conversion(t);
}

Typescript 目前抱怨从转换函数返回的 toutput 参数,这是默认参数。

我试图让 IDE 认识到,给定默认参数,T 与 U 相同。

我的用例如下:

convert(1) // returns 1
convert(1, x => ({x})) // returns an object with { x : 1 }

有什么方法可以让编译器静音并能够在上面正确创建这个函数?

4

2 回答 2

1

试试这样:

static convert<T, U = T>(t: T, conversion: ((toutput: T) => U) = t => t as T & U) {
  return conversion(t);
}

const x = convert(1);
const y = convert(1, x => ({x}));

用作T的默认值U,并将conversion函数默认值的返回类型转换为T & U

于 2019-03-14T18:44:02.050 回答
1

我认为你可以通过重载来实现这一点:

public static function convert<T>(t: T): T;
public static function convert<T, U>(t: T, conversion: (t: T) => U): U;
public static function convert<T, U>(t: T, conversion?: (t: T) => U) {
    return conversion ? conversion(t) : t;
}

..

const foo = convert(1)             // inferred type 1
const bar = convert(1, x => ({x})) // inferred type { x : number }

1扩大到number是因为隐式文字类型在返回值的上下文中被扩大(例如x => ({x})),这反过来又导致 被T推断为number。您可以通过显式键入第一个参数来避免这种情况:

const bar = convert(1 as 1, x => ({x})) // inferred type { x: 1 }
于 2019-03-14T18:30:39.307 回答