根据TypeScript中的参数在字典中定义函数的返回类型

奈郎

我有一个函数,该函数将根据function参数返回不同的对象。有没有办法可以在Typescript中实现呢?

这是我走了多远:

type returnMap = {
    'a': number,
    'b': string[]
}

function func<T extends returnMap, K extends keyof T>(val: K): T[K] {
    if (val == 'a') {return 5}
    if (val == 'b') {return ['a', 'b']}
    return 42
}
console.log(func('a'))  // 5

但是,在返回值处显示“ TS2322:类型'5'不能分配给类型'T [K]'”。

先感谢您

托马斯·加维尔(Tomasz Gawel)

这样可以:

interface ReturnMap {
  'a': number;
  'b': string[];
}

function func<K extends keyof ReturnMap>(val: K): ReturnMap[K];
function func(val: keyof ReturnMap): ReturnMap[keyof ReturnMap] {
  if (val === 'a') return 5;
  if (val === 'b') return ['a', 'b'];
  throw new Error();
}

const r1 = func('a'); // const r1: number
const r2 = func('b'); // const r2: string[]

// Argument of type '"c"' is not assignable to parameter of type '"a" | "b"'.ts(2345)
const r3 = func('c'); // const r3: number | string[]

注意函数重载语法:

function func<K extends keyof ReturnMap>(val: K): ReturnMap[K];
function func(val: keyof ReturnMap): ReturnMap[keyof ReturnMap] { // ...

如果仅使用第二个签名,则返回的类型将始终为number | string[]

如果您仅使用第一个签名,则将ReturnMap[K]其评估为number & string[]排他性的,因此您会收到上述问题中描述的错误。

顺便说一下,被ReturnMap[K]评估为number & string[]似乎是越野车行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从Typescript中的函数获取参数类型

TypeScript箭头函数中参数的类型

根据TypeScript中的参数值更改返回类型

根据参数中的属性强制执行函数的返回类型

根据提供的参数返回字典键的Typescript类型推断

TypeScript中的字典类型

TypeScript:如何在带有rest参数的函数中返回条件类型?

根据TypeScript中的参数动态生成返回类型

TypeScript根据类型参数返回不同的类型

函数参数是TypeScript类型中存在的属性

如何根据Typescript中的字符串参数定义函数的参数类型?

TypeScript子类:如何设置父类中定义的方法的参数类型和返回类型

在TypeScript中按类型排除函数参数

TypeScript:如何根据函数参数类型设置函数返回值类型

在TypeScript中,如何在函数的返回类型中将参数的值用作属性名称?

Typescript:如何根据参数类型获取函数的返回类型?

从函数中推导返回/参数类型

是否可以根据函数参数类型的定义映射来定义函数返回类型?

在类中定义私有结构时,如何将其用作函数参数或返回类型?

根据参数中向量的类型重载函数

返回在函数参数中输入的键列表的字典

函数的类型推断作为 Typescript 中的参数

在函数参数中传递用户定义的类型

返回从数组参数中输入的键定义的选择类型的函数

属性Python函数中的参数类型定义

在字典中定义函数

TypeScript - 基于参数类型的函数返回类型

根据参数定义函数的返回类型

Typescript 根据参数强制函数返回类型为接口的键