如果您使用spread语句向组件发送props ,为什么typescript会中断?

示例代码

type SomeComponentProps = Readonly<{
  someTitle: string
}>

const SomeComponent = ({ someTitle }: SomeComponentProps) => {
  return <>someTitle</>
}

const MainComponent = () => {
  const someTitle = 'Some title'
  const TICK = 'TICK'

  return <SomeComponent {...{ someTitle, TICK }} />
}

link codesandbox

勾号没有红色下划线,过梁不会拾取错误

推荐答案

这是一种存在于TS的行为,也没有react .

举个例子:

const split = { a : 1 , b : 2};
const func = ({a } :{ a : number}) => {
    console.log(a);
};
func(split)

TS不会抱怨上述情况.您可能会向对象传递额外的键,但只要传递强制键,它就可以工作.

现在举个例子:

const split3 = { a : 1 };
const split2 = { x : 1};
const func2 = ({x ,a} :{ x : number, a: number}) => {
    console.log(x);
};

func2(split)
func2(split2)

由于未提供both x and a,且仅提供其中一项,TS将错误地删除上述两项声明.

Demo

props也是functional组件传递的数组之一,当向其任何对象传递额外的键时,它不会出错.在大多数情况下,不会判断对象的额外属性.

注意:在指定对象文字时,仍会判断多余的属性.Below将抛出错误:

interface test{ 
    a: number;
}

let x : test = {
    a: 1,
    b: 2,
}

Typescript相关问答推荐

Typescript自定义键映射

类型脚本:类型是通用的,只能索引以供阅读.(2862)"

如何根据参数的值缩小函数内的签名范围?

如何在类型脚本中声明对象其键名称不同但类型相同?

您可以创建一个类型来表示打字员吗

如何根据模板类型实现不同的模板函数行为?

扩展函数签名中的参数类型,而不使用泛型

将对象属性转换为InstanceType或原样的强类型方法

在嵌套属性中使用Required

如果字符串文字类型是泛型类型,则用反引号将该类型括起来会中断

从子类构造函数推断父类泛型类型

按函数名的类型安全类型脚本方法包装帮助器

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

确保对象列表在编译时在类型脚本中具有唯一键

如何从接口中省略接口

Typescript,如何在通过属性存在过滤后重新分配类型?

垫子工具栏不起作用的Angular 布线

如何在Next.js和Tailwind.css中更改悬停时的字体 colored颜色

如何从JWT Reaction中提取特定值

React-Router V6 中的递归好友路由