在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。
答案 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'