从默认值进行Typescript泛型类型推断

vwkv1x7d  于 2023-10-22  发布在  TypeScript
关注(0)|答案(2)|浏览(131)

考虑以下函数。

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

Typescript当前抱怨从转换函数返回的toutput参数,这是默认参数:
类型“T”不能分配给类型“U”。'U'可以用一个与'T'无关的任意类型示例化。
我试图让IDE认识到,给定默认参数,T与U相同。
我的用例如下:

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

有没有什么方法,任何人都知道沉默的编译器,并能够创建这个函数以上正确?

sd2nnvve

sd2nnvve1#

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

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 }
svgewumm

svgewumm2#

试试这样做:

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

相关问题