在函数接口中对类数组进行类型检查

时间:2017-06-13 09:17:43

标签: typescript

在TypeScript中,当创建一个函数接口并将其用作另一个函数所期望的类型(即期望回调的函数)时,回调函数的参数是一个类的数组。类型检查似乎无法处理它:

"use strict";

class A {
  /* no-op */
}

interface C {
  (s: Array<A>): void
}

const B = (c: C) => {
  c(["Hello World!"]);
};

B((s: Array<A>) => {console.log("Should work", s)});
B((s: A) => {console.log("Should not work", s)});

在这种情况下,我相信对B的第二次调用应该不能进行类型检查,因为它不会期望一个类实例数组,而是一个原语如string:

"use strict";

interface C {
  (s: Array<string>): void
}

const B = (c: C) => {
  c(["Hello World!"]);
};

B((s: Array<string>) => {console.log("Should work", s)});
B((s: string) => {console.log("Should not work", s)});

未能通过以下方式进行类型检查:

test.ts(12,3): error TS2345: Argument of type '(s: string) => void' is not assignable to parameter of type 'C'.
  Types of parameters 's' and 's' are incompatible.
    Type 'string[]' is not assignable to type 'string'.

在尝试搜索答案时我找不到任何与此相关的内容,并且我使用的是TypeScript 2.3.4。

1 个答案:

答案 0 :(得分:0)

您没有收到任何编译错误的原因是您的A类为空,而typescript is based on structural subtyping空类/对象与所有内容匹配,例如:

class A {}

let a1: A = 4;
let a2: A = true;
let a3: A = "string";

一切都很好,没有编译错误。

当您将成员引入课程A时,您就会开始收到错误:

class A {
    dummy: number;
}

let a1: A = 4; // ERROR: Type '4' is not assignable to type 'A'
let a2: A = true; // ERROR: Type 'true' is not assignable to type 'A'
let a3: A = "string"; // ERROR: Type '"string"' is not assignable to type 'A'

const B = (c: C) => {
    c(["Hello World!"]); // ERROR: Argument of type 'string[]' is not assignable to parameter of type 'A[]'
};

B((s: A) => { console.log("Should not work", s); }); // ERROR: Argument of type '(s: A) => void' is not assignable to parameter of type 'C'