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

在TypeScript[重复]中实现条件返回类型的函数

段干浩荡
2023-03-14

假设我想写一个函数,它可以接受一个参数,这个参数可以是null类型,也可以是非null类型。如果参数不可为null,则返回类型也应不可为null。类似地,如果参数是可空类型,那么返回类型也应该是可空类型。

以下是我为实现这一职能所做的尝试:

type TransformKey = 'one' | 'two' | 'three'
function transform<T extends TransformKey | null>(key: T): T extends TransformKey ? string : string | null {
    if (key === null)
        return null as any
    else
        return key.toUpperCase() as any
}

函数签名似乎是正确的,因为它在调用站点上实现了所需的行为,例如:

const neverNullArg = 'two'
const neverNullResult: string = transform(neverNullArg)

const maybeNullArg: TransformKey | null = 'three'
const maybeNullResult: string | null = transform(maybeNullArg)

即返回类型确实由参数类型以正确的方式确定。

然而,我的问题在于函数的实现。如果不将返回值强制转换为any,两个返回语句都会导致TS2322错误:类型“null”/“string”不可分配给类型“T extends TransformKey”?字符串:字符串| null'。因此,我想知道该函数如何以满足签名的方式实现,而不会像任何类型转换或/@ts ignore那样破坏键入系统

共有1个答案

鲜于河
2023-03-14

可以为函数创建重载:

type TransformKey = 'one' | 'two' | 'three'

function transform(key: TransformKey): string;
function transform(key: TransformKey | null): string | null;
function transform(key: any): string | null {
    if (key === null)
        return null;
    else
        return key.toUpperCase();
}
const neverNullArg = 'two'
const neverNullResult: string = transform(neverNullArg)

const maybeNullArg: TransformKey | null = 'three'
const maybeNullResult: string | null = transform(maybeNullArg)

另请参见:编写良好的重载

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

  • 我在玩TypeScript中的条件类型。我想用条件返回类型编写一个函数。如果函数被传递一个字符串,它将返回一个名称,否则它将返回一个Id。 我在返回语句中得到以下错误: 我错过了什么?Thnx! 编辑:直接摘自Anders Hejlsberg在Build 2018上的演讲:https://youtu.be/hDACN-BGvI8?t=2241 他甚至说“我们不再需要写函数重载了…” 如果我将代码更

  • 我想基于泛型值返回不同的类型。例如: 但我有一个错误: 类型字符串[]不能分配给类型T扩展Base?String[]:字符串

  • 我有一个匿名函数,如下所示: 我想指定cb必须返回一个布尔值,但我是一个打字稿新手,不知道我是否可以(或者即使我这样做或不这样做会对解析器产生影响)。 我该怎么做?

  • 我在这里查过了https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md这是TypeScript语言规范,但我找不到如何声明函数的返回类型。 我在下面的代码中展示了我所期望的: 我知道我可以用

  • (沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢