TypeScript开发Lit Element时装饰器与类字段更新报错求助
解决Lit Element + TypeScript的两类报错问题
一、Chrome运行时报错(类字段覆盖更新访问器)
报错原因:使用原生类字段初始化name = 'Somebody'会覆盖Lit自动生成的属性访问器,导致属性值变化无法触发组件更新。
解决方法:
- 方案1:移除类字段的直接初始化,在组件构造函数中完成属性赋值
- 方案2:用
declare关键字声明属性类型,再在构造函数中初始化(适合需要明确类型约束的场景)
二、IDE装饰器语法报错
报错原因:TypeScript的装饰器语法版本不匹配,Lit采用的是标准ECMAScript装饰器,而旧版实验性装饰器配置会触发类型校验错误。
解决方法:修改项目根目录的tsconfig.json编译配置:
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", "useDefineForClassFields": true, "experimentalDecorators": false, // 关闭实验性装饰器模式 "strict": true, "skipLibCheck": true } }
修改后的完整代码
方案1(构造函数初始化)
import { LitElement, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; @customElement('student-ids') export class StudentIds extends LitElement { @property() name: string; constructor() { super(); this.name = 'Somebody'; } render() { return html` <h1>Classroom Ids</h1> <p>Hello, ${this.name}!</p> `; } }
方案2(declare声明类型)
import { LitElement, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; @customElement('student-ids') export class StudentIds extends LitElement { @property({ type: String }) declare name: string; constructor() { super(); this.name = 'Somebody'; } render() { return html` <h1>Classroom Ids</h1> <p>Hello, ${this.name}!</p> `; } }
内容的提问来源于stack exchange,提问作者Alex Jongman
相关产品推荐
相关产品推荐

