我试图输入一个回调,我以为我有它的工作。但我刚刚意识到,当我添加一个"声明类"时,我最近打破了我的定义。
在下面的代码中,我不希望1可以接受为ValidationError
或Error
,但我没有收到ValidationError
的警告,为什么不呢? / p>
type CallbackBroken = {
(error: ValidationError): void;
(error: null, value: string): void;
}
type CallbackWorking = {
(error: Error): void;
(error: null, value: string): void;
}
function doThings1(c: CallbackBroken) {
c(null, 'b');
c(1);
}
function doThings2(c: CallbackWorking) {
c(null, 'b');
c(1);
}
declare class ValidationError {
constructor(errorCode: number);
}

答案 0 :(得分:2)
实例类型ValidationError
为structurally compatible,{}
,因为您已声明没有实例属性,而only instance members are checked当编译器检查某个值是否兼容时一类。由于1
是有效的{}
,因此编译得很好。
编辑:{}
类型为"空类型"或"空接口"。它没有声明的属性,几乎没有限制满足它的值。 (仅null
和undefined
与{}
不兼容)。在TypeScript中,对于类型为A
的变量,一种类型的值为B
,如:
declare const a: A; // value of type A
const b: B = a; // assigned to variable of type B
如果类型B
中的所有声明属性都等于A
中同名属性的(或子类型)。如果B
为{}
,则您无法在任何类型A
中找到与之冲突的单个属性。所以这很好:
const a = 1; // value of type 1, has all the properties of Number instances
const b: {} = a; // assigned to variable of type {}.
反之亦然:
const a = {}; // value of type {}
const b: 1 = a; // error, Type '{}' is not assignable to type '1'.
ValidationError
是否有任何方法或属性?如果你在类声明中添加一个它应该解决你的问题。例如,如果ValidationError
实现了Error
,那么您可以将其更改为:
declare class ValidationError implements Error {
constructor(errorCode: number);
name: string;
message: string;
stack?: string;
}
或@ err1100建议,因为Error
也是Error
个对象的构造函数的名称,所以:
declare class ValidationError extends Error {
constructor(errorCode: number);
}
它应该按照你的预期行事。
希望有所帮助;祝你好运!