首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在TypeScript中修改文字的推断类型?

是否可以在TypeScript中修改文字的推断类型?
EN

Stack Overflow用户
提问于 2020-12-14 14:15:40
回答 2查看 61关注 0票数 1

考虑下面的代码,该代码尝试有条件地向具有推断类型的对象添加属性:

代码语言:javascript
复制
const foo = {
    a: 1,
    b: 2,
};

if (bar) {
    foo.c = 3; // Error: Property 'c' does not exist on type '{ a: number; b: number; }'.(2339)
}

可以通过显式地将foo类型声明为{ a: number; b: number; c?: number; }或使用展开来有条件地添加c来消除错误

代码语言:javascript
复制
const foo = {
    a: 1,
    b: 2,
    ...(bar ? { c: 3 } : {}),
};

但是,假设我们想要保留原始代码结构,但又想避免必须显式声明可以推断的属性。有没有什么解决方案可以同时满足这两个要求?例如,是否有可能以某种方式调整推断的类型,例如:

代码语言:javascript
复制
const foo = {
    a: 1,
    b: 2,
} as { ...; c?: number; }; // Example, does not work
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-14 14:38:00

这并不美观,但它是有效的:ab的属性类型是推断出来的,并且不需要重复声明。

代码语言:javascript
复制
function withMissingProps<T>() {
  return function<S>(obj: S): S & Partial<T> {
    return obj;
  }
}

const foo = withMissingProps<{ c: number }>()({
  a: 1,
  b: 2
});

if(Math.random() > 0.5) {
  foo.c = 1;
}

声明属性和推断属性分别有两个类型参数TS。不幸的是,如果一个函数有两个类型参数,那么你必须同时提供两个类型参数,或者同时推断两个类型参数;解决方案是使用curry函数,尽管这意味着额外的一对括号。

Playground Link

票数 2
EN

Stack Overflow用户

发布于 2020-12-16 21:53:31

我还发现了这个漏洞,不幸的是,它编译成了Object.assign,因此具有非零的运行时成本:

代码语言:javascript
复制
const foo = {
  a: 1,
  b: 2,
  ...{} as {
    c?: number,
  },
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65284452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档