当我将接口的任何属性设为可选时,将其成员分配给其他变量时出现如下错误
TS2322:键入“字符串| 未定义”不能分配给“字符串”类型。类型“未定义”不能分配给类型“字符串”。
interface Person {
name?:string,
age?:string,
gender?:string,
occupation?:string,
}
function getPerson(){
let person = <Person>{name:"John"};
return person;
}
let person: Person = getPerson();
let name1:string = person.name;//<<<Error here
Run Code Online (Sandbox Code Playgroud)
如何解决此错误?
这个问题的标题是 Angular CLI 编译器抛出的消息。
我的 app.component.ts 中有这个构造函数:
export class AppComponent {
constructor(private userService: UserService, private auth: AuthService, router: Router) {
auth.user$.subscribe(user => {
if (user) {
userService.save(user);
let returnUrl = localStorage.getItem('returnUrl');
router.navigateByUrl(returnUrl);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
在上面附加的代码部分中,我在“returnURL”处加了下划线,如果我将光标移到上面,它会显示:
“‘string | null’类型的参数不可分配给‘string | UrlTree’类型的参数。‘null’类型不可分配给‘string | UrlTree’类型。”
我有一个与 Firebase 相关的 user.service.ts:
import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
import * as firebase from 'firebase';
@Injectable()
export class UserService {
constructor(private db: AngularFireDatabase) { }
save(user: firebase.User) {
this.db.object('/users/' …Run Code Online (Sandbox Code Playgroud) 我在应用程序的 localStorage 中存储了很多值,并且需要一种将“字符串”转换回数字的方法 - 如果它是数字。想法是,如果您<input type="number"> on your form, then the data going into the form and extracted from the form IS a number, but once stored - its converted to a string. So to repopulate that稍后强制使用 HTML 字段,则必须读取 localStorage 值并将其转换回数字,然后再重新填充输入字段 - 否则您会开始收到大量重复警告,有时还会收到错误,因为需要 NUMBERS,但 localStorage 正在检索字符串。
我的方法:假设输入的值是数字,那么只会存储一个数字(仅数字) - 因此您可以假设只会出现数字(即使它们是字符串)。只知道会返回数字可以实现这一点:
var allVariables = {} ;
var reg = new RegExp(/^\d+$/) ; // this accounts for digits only
for (var x=0; x<localStorage.length;x++) {
var keyValue = localStorage.getItem(localStorage.key(x)) ;
if (reg.text(keyValue)) …Run Code Online (Sandbox Code Playgroud) 我很难弄清楚如何使用 React 和 TS 从 localStorage 设置组件状态。在我检查 localStorage 实例是否存在后,它仍然显示类型不兼容,因为localStorage.getItem()仍然可以返回字符串或 null。
如果我更改界面并添加,string |\xc2\xa0null我可以从 localStorage 设置状态,但是我无法再自行设置 localStorage,因为localStorage.setItem()似乎只接受string而不接受string | null
编辑
\n\n我想出了这个问题的“解决方案”。我不确定这是否是不好的做法,但它似乎有效。如果可以用更好的方式写出来,请告诉我。
\n\ncomponentWillMount() {\n let from = localStorage.getItem(\'from\');\n let to = localStorage.getItem(\'to\');\n let fromId = localStorage.getItem(\'fromId\');\n let toId = localStorage.getItem(\'toId\');\n\n if (typeof from === \'string\' &&\n typeof to === \'string\' &&\n typeof fromId === \'string\' &&\n typeof toId === \'string\') {\n\n this.setState({\n inputFrom: from,\n inputTo: to,\n fromId: fromId,\n toId: toId,\n …Run Code Online (Sandbox Code Playgroud) 错误发生在这里:
let moonPortfolio;
...
moonPortfolio = JSON.parse(localStorage.getItem('moonPortfolio'));
Run Code Online (Sandbox Code Playgroud)
我发现这个答案很有意义,但是在重构后我仍然收到该错误:
正如错误所说,localStorage.getItem() 可以返回字符串或空值。JSON.parse() 需要一个字符串,因此您应该在尝试使用它之前测试 localStorage.getItem() 的结果。
if (portfolio.length === 0) {
const storedPortfolio = localStorage.getItem('moonPortfolio');
if (typeof storedPortfolio === 'string') {
moonPortfolio = JSON.parse(localStorage.getItem('moonPortfolio'));
}
else {
moonPortfolio = [];
}
if (moonPortfolio) {
const savedPortfolio = Object.values(moonPortfolio);
this.props.fetchAllAssets();
// this.props.addCoins(savedPortfolio);
}
}
Run Code Online (Sandbox Code Playgroud)
我首先将 localStorage 的结果设置moonPortfolio为 var,然后检查 var 是否为typeof字符串。仍然收到打字稿错误?
这里有什么想法或方向吗?