从默认值得出Typescript通用类型推断

时间:2019-03-14 18:10:12

标签: typescript

请考虑以下功能。

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 }

有人知道有什么方法可以使编译器静音并能够在上面正确创建此函数吗?

2 个答案:

答案 0 :(得分: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 }

答案 1 :(得分: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