【问题标题】:Generic Object Param as Its Literal通用对象参数作为其文字
【发布时间】:2020-07-25 12:42:29
【问题描述】:

我有一个接受通用对象的简单函数。返回类型应与该对象相同,但缩小范围类似于 as const 断言的工作方式。

例如。下面的返回类型应该是{ a: "first"; b: "second" } 而不是{ a: string; b: string }

myFn({ a: "first", b: "second" });

是否有一种机制可以指示类型检查器 myFn 的返回类型是其第一个参数类型,已缩小?

【问题讨论】:

    标签: typescript generics casting constants narrowing


    【解决方案1】:

    返回类型应与该对象相同,但缩小范围类似于 const 断言的工作方式。

    您可以通过将类型作为类型参数传递给函数来实现此目的。

    function myFn<T>(args): T {
      // do stuff
      return null;
    }
    
    const a = myFn<{ a: "first"; b: "second" }>(args);
    

    type MyObj = { a: "first", b: "second" }
    const a = myFn<MyObj>(args);
    

    不幸的是,对象需要在编译时完全定义,因为类型在运行时不可用。

    旧答案(被误解)

    如果您希望返回类型与参数类型相同。然后就可以使用泛型类型参数了。

    function MyFunction<T>(argument1: T, anotherArg: number): T {
      // do stuff
    }
    
    // result will be of type User
    const result = MyFunction<User>(user, 9);
    

    在某些情况下,您可以这样做。

    // user must be defined as type User above somewhere
    const result = MyFunction(user, 9);
    

    【讨论】:

    • declare function accept&lt;R extends Record&lt;string, unknown&gt;&gt;(record: R): R;
    • const accepted = accept({ a: "a", b: "b", c: "c" });
    • accepted 的类型是{ a: string; b: string; c: string },而不是{ a: "a"; b: "b"; c: "c" }
    • 糟糕的答案(如果有投票权的人认为他们是这样的话)实际上增加相比之下,赞成的答案的可见度。所以没有必要担心。但是,在这种情况下,我会考虑仅存在一个您认为不满意的未投票答案,这表明需要明确问题。这就像明确没有其他反馈一样,stackoverflow.com/help/no-one-answers
    • 如果您在两端指定缩小类型,则此处的解决方案有效(let x: {a: "a", b: "b", "c"} = accept({a: 'a', b: 'b', c: 'c'});。由于 TypeScript 编译器的限制,对象成员字段并不总是保持缩小状态(请参阅问题 31755)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-04-18
    • 1970-01-01
    • 2015-07-15
    • 2012-11-07
    相关资源
    最近更新 更多