同时获取正确的类型推断和编辑建议

时间:2018-10-03 12:24:17

标签: typescript

我想编写一个接受配置对象并返回其处理后版本的函数,该函数具有相同的键,但值不同。此功能必须:

  1. 当我想调用该函数时,提供有关配置属性的建议。
  2. 让编译器知道该函数究竟返回了哪些属性。

type Config = {
    a?: number
    b?: string
}

function f(x: Config): Config {
    return x
}

function g<T extends Config>(x: T): T {
    return x
}

在此代码中, f()仅满足第一个要求,而 g()仅满足第二个要求:

f({a: 1}).<CTRL+SPACE> // Shows that the result's type is "{ a?: number, b?: string }", but I want it to be "{ a: number }".

g({<CTRL+SPACE> // Doesn't show suggestions for Config type.

有没有一种方法可以同时满足这两个要求?

3 个答案:

答案 0 :(得分:1)

Readme.md diff=nodiff xzy.txt diff=nodiff T之间使用交集类型实际上将帮助代码完成正确地建议,并且据我所知不会影响类型推断:

Config

Playground link

答案 1 :(得分:0)

修改函数中的对象,并从签名中删除返回类型。

在您的示例中,您必须修改对象-创建一个具有与所需值相同的值的新对象(Object.assign应该起作用)-因为如果要返回进入该对象的对象,则该对象类型将被返回(即使某些可选属性为null,编译器也会接受某种类型)。

从签名中删除返回类型应允许类型推断起作用并推断新类型。您可能必须定义一个自定义类型。如果没有,您可能会得到“ any”,并且以后必须检查所需的属性。我之所以说“可能”,是因为我不确定TypeScript的版本及其在您计算机上的设置。

答案 2 :(得分:0)

我不确定您的情况如何。但是,如果您要更改函数参数的类型,并且知道基于传入类型的函数将返回哪些数据类型(假设每个具有字符串类型的属性都将生成数字,而其他所有类型都将生成字符串),则可以使用映射像这样playground

有关更多信息:Advanced types docs