【问题标题】:Generate a const typed object in TypeScript在 TypeScript 中生成一个 const 类型的对象
【发布时间】:2022-01-14 09:46:45
【问题描述】:

我正在尝试通过传入一个我想用作类型的字符串来生成一个const 类型化的对象,这可能吗,我已经尝试了以下方法,但它输出了错误的类型。

const test = <T> (name: T) => {
  const hi: { name: T } = {
    name
  } as const
  return hi
}

const test1 = test('hello')

我希望这是类型

{
    name: 'hello';
}

但它是类型

{
    name: string;
}

【问题讨论】:

  • 你需要写test('hello' as const),否则会推断test&lt;string&gt;(…)
  • 你已经很接近了,缺少的部分主要是as const on hello
  • 真棒......唯一的麻烦是我试图摆脱开发人员不得不写as const,因为我认为他们会错过这一点,有没有办法强制执行,或者有一个可以为我添加这个作为助手的函数?
  • 为什么要强制开发者使用常量字符串类型?如果他们使用string会有什么问题?

标签: javascript typescript


【解决方案1】:

为了推断参数的文字类型,通常您需要为泛型参数添加适当的约束。 看这个例子:

function test<T extends string>(name: T) {
  return { name };
}

const test1 = test('hello') // {name:"hello"}

如果您对更多示例感兴趣,可以查看我的article

如果要添加一些验证,可以使用条件类型:

// Forbids using underscore as a prefix
type IsAllowed<T extends string> = T extends `_${string}` ? never : T

function foo<T extends string>(name: IsAllowed<T>) {
  return { name };
}


const test1 = foo('hello') // ok 
const test2 = foo('_hello') // expected error

或者您可以使用此实用程序类型:

type IsLiteral<T extends string> = T extends string ? string extends T ? never : T : never

function test<T extends string>(name: IsLiteral<T>) {
  return { name };
}

如果您只想允许字符串文字

【讨论】:

  • function test&lt;T extends string&gt;(name: IsHello&lt;T&gt;) { 是一种使用条件类型编写function test(name: 'hello') { 的非常漫长而复杂的方式,不是吗?
  • 很棒的伙计们非常感谢您的帮助,它 100% 回答了我遇到的问题
  • @BenjaminGruenbaum 我已经更新了我的答案,使其更加清晰。
  • 很好,我有 >600 LoC 推断条件类型的类型(讨厌语法,但大型代码库意味着少数非常常见的类型可以从这种事情中受益)。从 4.5 开始,这非常有用,它产生了非常好的结果类型。其中一些解析了我们使用的整个 DSL :D
  • 最大的实际上是用于 security.microsoft.com 的导入,它解析我们的微前端用于动态导入另一个前端(推断包和导入)的语法,然后从大 (自动生成的)import types 列表。看起来很像一个金字塔。另一个重要的是我们的建模层(将 JSON/gRPC 从后端转换为 TS 类型的东西),因为我们避免使用装饰器 - 它将像 { foo: String } 这样的东西递归地映射到 foo: string 的类型。这是 `it gist.github.com/benjamingr/937efb344a0faa3f498be28f5d55e383 的一小部分
猜你喜欢
  • 2022-01-21
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多