Typescript 同时获得适当的类型推断和编辑器建议

Typescript 同时获得适当的类型推断和编辑器建议,typescript,Typescript,我想写一个函数,它接受一个config对象并返回它的已处理版本,该版本具有相同的键,但值不同。此功能必须: 当我想调用函数时,提供config属性的建议 让编译器知道函数返回的确切属性 类型配置={ a:号码 b:字符串 } 函数f(x:Config):配置{ 返回x } 函数g(x:T):T{ 返回x } 在此代码中,f()仅满足第一个要求,g()仅满足第二个要求: f({a: 1}).<CTRL+SPACE> // Shows that the result's type i

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

  • 当我想调用函数时,提供config属性的建议
  • 让编译器知道函数返回的确切属性
  • 类型配置={
    a:号码
    b:字符串
    }
    函数f(x:Config):配置{
    返回x
    }
    函数g(x:T):T{
    返回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.
    
    f({a:1})。//显示结果的类型是“{a:数字,b:字符串}”,但我希望它是“{a:数字}”。
    g({//不显示配置类型的建议。
    

    有没有办法编写一个同时满足这两个要求的函数?

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

    在您的示例中,您必须修改对象——创建一个具有所需值的新对象(object.assign应该有效)——因为如果您返回进入该对象的对象,将返回相同的类型(编译器接受某个类型,即使某些可选属性为null)


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

    T
    Config
    之间使用交集类型实际上会帮助代码完成正确地获得建议,并且不会影响类型推断,据我所知:

    type Config = {
        a?: number
        b?: string
    }
    
    function g<T extends Config>(x: T & Config): T {
        return x
    }
    let justA = g({ a: 0 });// of type { a: number }
    g ({ /* Ctrl Space here suggets a and b  */})
    
    类型配置={
    a:号码
    b:字符串
    }
    函数g(x:T&Config):T{
    返回x
    }
    设justA=g({a:0});//类型为{a:number}
    g({/*Ctrl空格此处为a和b*/})
    

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


    有关详细信息:

    我认为这不是关于语言的问题,而是关于你正在使用的一些工具。问题中缺少了这个工具。@BartekBanachewicz大多数工具都使用内置在编译器中的typescript语言服务,因此它应该主要以相同的方式工作。。太好了!非常感谢!:)
    type Config = {
        a?: number
        b?: string
    }
    
    function g<T extends Config>(x: T & Config): T {
        return x
    }
    let justA = g({ a: 0 });// of type { a: number }
    g ({ /* Ctrl Space here suggets a and b  */})