Javascript 类型脚本错误:;类型';编号';不可分配给类型';绝不';
您可以在TS操场上检查错误: typescript:v3.8.3Javascript 类型脚本错误:;类型';编号';不可分配给类型';绝不';,javascript,typescript,Javascript,Typescript,您可以在TS操场上检查错误: typescript:v3.8.3 err:Type'number'不可分配给Typenever。 我不明白为什么它是一个从不类型。如果在属性访问之后将作为任何放置,则TypeScript将检查键是否为有效键 interface Opts { onFrame: () => void; onAudioSample: null; emulateSound: boolean; sampleRate: number; } class NES {
err:Type'number'
不可分配给Typenever
。
我不明白为什么它是一个
从不
类型。如果在属性访问之后将作为任何
放置,则TypeScript将检查键
是否为有效键
interface Opts {
onFrame: () => void;
onAudioSample: null;
emulateSound: boolean;
sampleRate: number;
}
class NES {
constructor(opts: Opts) {
this.opts = {
onFrame() { },
onAudioSample: null,
emulateSound: true,
sampleRate: 44100,
}
if (typeof opts !== "undefined") {
let key: keyof Opts
for (key in this.opts) {
if (typeof opts[key] !== "undefined") {
// got err here
this.opts[key] = opts[key];
}
}
}
}
opts: Opts
}
如果将
作为任何
放在属性访问之后,TypeScript将检查键
是否为有效键
interface Opts {
onFrame: () => void;
onAudioSample: null;
emulateSound: boolean;
sampleRate: number;
}
class NES {
constructor(opts: Opts) {
this.opts = {
onFrame() { },
onAudioSample: null,
emulateSound: true,
sampleRate: 44100,
}
if (typeof opts !== "undefined") {
let key: keyof Opts
for (key in this.opts) {
if (typeof opts[key] !== "undefined") {
// got err here
this.opts[key] = opts[key];
}
}
}
}
opts: Opts
}
我不知道你为什么会犯这样的错误。合并这两个选项的另一种方法可能是使用排列运算符
if (typeof opts[key] !== "undefined") {
(this.opts[key] as any) = opts[key];
}
我不知道你为什么会犯这样的错误。合并这两个选项的另一种方法可能是使用排列运算符
if (typeof opts[key] !== "undefined") {
(this.opts[key] as any) = opts[key];
}
之所以出现此错误,是因为TypeScript无法推断
this.opts[key]
和opts[key]
是同一类型。如果您要覆盖每一半的=
:
可以是选择[键]
、函数
、空值
、或布尔值
数字
需要接收一个this.opts[key]
、函数
、null
或布尔值
取决于我们不知道的数字
键的值
、函数
、空
和布尔
的唯一共同超类型是数字
, 这就是TypeScript想要的从不
this.opts[key]
Opts[K]
。提出了类似的解决方案
if(选项的类型[键]!=“未定义”){
//this.opts[key]=opts[key];
((k:k)=>{this.opts[k]=opts[k];})(键);
}
也就是说,我将使用中的扩展运算符,用…opts
结束对this.opts
的赋值,或者使用Object.assign
。传递的opts
包含额外键的风险很小,但是Typescript应该在编译时确保不包含额外键。(就此而言,如果您希望opts
是可选的且可能不完整,则可能应将其定义为opts?:Partial
)
类{
构造函数(选项?:部分){
this.opts=Object.assign({
onFrame(){},
onAudioSample:null,
真的,,
采样器:44100,
},opts);
}
选项:选项
}
另请参见:,其中指出解决方案非常相似,并且都适用于默认选项值。由于TypeScript无法推断
这一点,因此您会遇到该错误。opts[key]
和opts[key]
是同一类型。如果您要覆盖每一半的=
:
可以是选择[键]
、函数
、空值
、或布尔值
数字
需要接收一个this.opts[key]
、函数
、null
或布尔值
取决于我们不知道的数字
键的值
、函数
、空
和布尔
的唯一共同超类型是数字
, 这就是TypeScript想要的从不
this.opts[key]
Opts[K]
。提出了类似的解决方案
if(选项的类型[键]!=“未定义”){
//this.opts[key]=opts[key];
((k:k)=>{this.opts[k]=opts[k];})(键);
}
也就是说,我将使用中的扩展运算符,用…opts
结束对this.opts
的赋值,或者使用Object.assign
。传递的opts
包含额外键的风险很小,但是Typescript应该在编译时确保不包含额外键。(就此而言,如果您希望opts
是可选的且可能不完整,则可能应将其定义为opts?:Partial
)
类{
构造函数(选项?:部分){
this.opts=Object.assign({
onFrame(){},
onAudioSample:null,
真的,,
采样器:44100,
},opts);
}
选项:选项
}
另请参见:,其中指出,解决方案非常相似,都适用于默认选项值。如果这样做,则不需要使用“as Opts”强制转换,对吗?在本例中为True,因为实例变量是在构造函数外部键入的。如果这样做,那么使用'as Opts'强制转换是不必要的,对吗?在这种情况下是正确的,因为实例变量是在构造函数之外键入的。谢谢,您的解决方案很好,我使用类型断言解决了它,似乎您的解决方案更好。我的解决方案:(this.Opts[key]as Opts[typeof key])=Opts[key]谢谢,您的解决方案很好,我用类型断言解决了它,似乎你的解决方案更好。我的解决方案:(this.opts[key]as opts[typeof key])=opts[key]