TypeScript / JSX类型断言仅在JSX外部有效

阿德里安·弗洛雷斯库(Adrian Florescu)

我有一个反应成分,它通过一个数组映射。

每个数组项都有一个可选的ID类型。

如果我有此ID,则将呈现一个元素,否则将不显示任何内容。

该元素具有一个onClick,该onClick调用一个函数来接受ID作为参数。

即使我检查我是否有ID,TypeScript仍然会抱怨ID可能是未定义的,而是仅在onClick方法内部而不是外部(请参见代码示例)

这是为什么?如何使该错误消失?

请在TypeScript操场上查看错误

在此处输入图片说明

// fake bindings
declare namespace React {
  function createElement(): any;
}

// This type has an optional prop
type SampleType = {
  id?: string;
  name: string;
}

const sampleArray: SampleType[] = [{id: 'test', name: 'Adrian'}, {name: 'Florescu'}]

function sampleFunction(id: string){
  console.log('ID', id);
}

function SampleComponent() {
  return (
    <div>
      {sampleArray.map((item: SampleType) => {
        if(item.id) {
          sampleFunction(item.id); // This works
          return <p onClick={() => { sampleFunction(item.id); }}>{item.name}</p>; //// This does not work
        }
      })}
    </div>
  )
};

const dom = <SampleComponent />;
TJ人群

不是JSX,而是时机。:-)由于点击后发生,这是完全有可能(从打字稿的角度来看),其id可能已经成为 undefined当你检查它,当你使用它,其中一间string的预期。同样的事情会在这里发生:

setTimeout(() => {
  sampleFunction(item.id); // Same error occurs
}, 1000);

解决的办法是使这不可能。一种选择是捕获id(当我们在那里时,我们也可以捕获name):

if(item.id) {
  const {id, name} = item;
  return <p onClick={() => { sampleFunction(id); }}>{name}</p>; // This works now
}

更新的游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeScript与JSX

JSX的Typescript设置类型注释

TypeScript:JSX元素类型没有任何构造或调用签名

Typescript Array [T]接受{..T}作为有效类型

TypeScript类型检查JSX子级

JSX节点中的TypeScript类型参数

我可以为Typescript中的变量做一个类型断言,该变量对整个块/函数都有效吗?

在没有React的TypeScript中使用JSX

TypeScript错误,还是没有?声明仅在以某些格式编写时有效

Typescript枚举比较“有效”有效,但“ ===”无效

无法在Typescript中编写高阶组件:JSX元素类型没有任何构造或调用签名

尝试编写TypeScript定义文件-JSX元素类型'SideMenu'没有任何构造或调用签名

TypeScript 3:JSX元素类型“ Component”没有任何构造或调用签名。[2604]

TypeScript 1.6错误:JSX元素类型XXX没有任何构造或调用签名

TypeScript 错误:JSX 元素类型“MultiSelect”没有任何构造或调用签名

React-Typescript:JSX 元素类型“组件”没有任何构造或调用签名

Typescript子类类型(类型断言)

为什么TypeScript无法推断此JSX工厂的返回类型?

从字符串创建JSX元素的正确TypeScript类型

如何修复通用TypeScript函数以返回有效的推断类型?

如何为EventEmitter之类的事件有效负载分配TypeScript类型?

Typescript:“ never”类型上不存在属性,但是函数有效吗?

Typescript:如何交换对象键值并获取交换函数的有效返回类型?

Typescript编译器不检查方法返回类型的有效性

TypeScript:为什么我不能分配类型为 { a: "a", b: "b" } 的对象的有效字段

如何在 redux typescript 中获取有效负载类型

Jsx 如何是有效的 javascript?

具有泛型的TypeScript对象文字类型断言

我可以在TypeScript中分配的左侧有类型断言吗?