当前位置: 首页 > 知识库问答 >
问题:

泛型函数上的条件类型:类型不可赋值

卓瀚
2023-03-14

我试图约束泛型函数的返回类型。(为了简化示例,请忽略函数的实际“有用性”)。

type MyReturnType<T> = T extends string ? number : Function;
type Input = string | number;
function myFn<T extends string | number>(input: T): MyReturnType<T> {
  return typeof input === 'string' ? 100 : (() => {});
}

但是返回语句会导致打字错误-

Type '100 | (() => void)' is not assignable to type 'MyReturnType<T>'.
  Type '100' is not assignable to type 'MyReturnType<T>'.

-这让我很困惑。在我的理解中,MyResnType

我觉得答案可能在条件类型的文档中,但我找不到它(老实说,这里文档的某些部分有点超出我的理解)。有人能给我解释一下这段话是怎么回事吗?

(TS 3.8.3)


共有2个答案

梁福
2023-03-14

这里的实际工作解决方案是使用重载:

type Input = string | number;
function myFn(input: string): number
function myFn(input: number): Function
function myFn(input: Input): number | Function {
    return typeof input === "string" ? 100 : () => {}
}

只要确保你写了一个来涵盖每一种输入类型的可能性。在我的例子中,我的论点有5种可能的类型(包括2种联合),我必须这样写:

type Value = string | number | null
export function divBy10toPow(value: string, power: number): number
export function divBy10toPow(value: null, power: number): null
export function divBy10toPow(value: number, power: number): number
export function divBy10toPow<T extends number | null>(value: T, power: number): T
export function divBy10toPow<T extends string | null>(value: T, power: number): T extends string ? number : null
export function divBy10toPow(value: Value, power: number): Value {
    return value === null
        ? null
        : BigNumber(value)
            .div(10 ** power)
            .toNumber()
}

您必须说明string|nullnumber|null的特定联合,否则它将无法正确键入返回值。

尤研
2023-03-14

类似于将类型缩小到联合类型的编译器限制:

类型true不能分配给类型T2扩展键T1?true: false'#22735

 类似资料:
  • 我正在尝试创建一个通用函数,它接受一个,并返回一个对象,该对象包含公共基类型的属性以及特定类型的默认值。出于某种原因,如果没有编译器的抱怨,我无法让它工作。我不确定问题出在哪里,但是 我怀疑这可能是将类型定义为条件类型的方式。我尝试过以各种方式重新定义我的类型,但没有成功,所以我怀疑我要么错过了一些明显的东西,要么没有类型断言是不可能的。 以下是我的类型: 以下是我的通用函数: 产生以下错误: 类

  • 我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的

  • 我正在尝试一个非常基本(人为)的条件类型函数,但遇到了意外错误: 我认为这是一个非常简单的条件类型用法,所以不确定发生了什么。有什么想法吗?

  • 如何为动态创建的函数声明泛型类型? 我如何在中使用并传递? < code>useFoo的预期用法

  • 我试图编写一个函数来返回

  • 我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。