我正在将一些JS代码迁移到TS,并且面临着区分TypeScript中的空类型与仅给出对象中字段的空值之间的问题。
这是一个虚拟的例子:
export const performProcedure = () => {
let newPerson = {
name: null,
birthdate: null
}
if (<someCheck>) {
newPerson.name = "Default name";
}
...
}
就JS而言,以上代码有效。但是,当我合并TS时,我得到一个错误,说Type 'Default name' is not assignable to type 'null'
。这样做似乎是因为现在TS将name : null
解释为说name
的类型为null
,这不是我想要的。我只想将其初始化为null。
如何解决我的问题?
答案 0 :(得分:2)
您可以告诉打字稿name
应该是字符串。
let newPerson = {
name: <string>null,
birthdate: null
}
拥有一个Person
界面会更好。
interace Person {
name: string;
birthdate: Date;
}
let newPerson: Person = {
name: null,
birthdate: null
};
答案 1 :(得分:1)
Typescript解析newPerson.name的类型为“ null”,因为您在此处放置了null。获得最佳解决方案的最佳方法是尽可能具体。如果要允许使用空值和字符串,请创建一个这样的接口:
interace Person {
name: string | null;
birthdate: Date | null;
}
let newPerson: Person = { ... }
这是最明确的。可能更好的方法是使用undefined而不是null。然后,您可以只使用可选参数:
interace Person {
name?: string;
birthdate?: Date;
}
值得注意的是,如果在tsconfig中启用了所有严格检查,则不能将null传递给定义为字符串的属性。那是一件好事,您不想看到任何“无法读取null的属性'length'的错误”错误消息。