在typescript

时间:2018-03-26 15:23:36

标签: typescript

我试图输入一个回调,我以为我有它的工作。但我刚刚意识到,当我添加一个"声明类"时,我最近打破了我的定义。

在下面的代码中,我不希望1可以接受为ValidationErrorError,但我没有收到ValidationError的警告,为什么不呢? / p>

Playground code



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);
}




1 个答案:

答案 0 :(得分:2)

实例类型ValidationErrorstructurally compatible{},因为您已声明没有实例属性,而only instance members are checked当编译器检查某个值是否兼容时一类。由于1是有效的{},因此编译得很好。

编辑:{}类型为"空类型"或"空接口"。它没有声明的属性,几乎没有限制满足它的值。 (仅nullundefined{}不兼容)。在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);
}

它应该按照你的预期行事。

希望有所帮助;祝你好运!