派生 class 中的打字稿推断函数参数
Typescript infer function parameters in derived class
我注意到当实现泛型接口(或class)并显式声明这些泛型的类型时,subclass 中函数的参数类型不会被推断出来。
interface MyInterface<T> {
open(data: T): void
}
class MyClass implements MyInterface<string> {
open(data) {
// Data should be string, but is any
}
}
目前正确的做法如下:
open(data: string) {
...
}
然而,这迫使我多次输入类型,这似乎是不必要的。以下会产生错误(这是预期的):
open(data: number) {
...
}
任何不是字符串的类型都会出错,所以编译器难道不能推断出该类型是字符串吗?
这是一个 known issue in TypeScript,可能会在某个时候修复。
正如其他答案所说,这是 TypeScript 编译器的已知问题。
有一种方法可以提供 MyInterface
的实现,方法参数将被推断出来,您只需要使用 returns 一个对象而不是 class 的函数:
interface MyInterface<T> {
open(data: T): void
}
function createMyObject(): MyInterface<string> {
return {
open(data) { // data type is inferred as string here
const n = data.length;
}
}
}
我注意到当实现泛型接口(或class)并显式声明这些泛型的类型时,subclass 中函数的参数类型不会被推断出来。
interface MyInterface<T> {
open(data: T): void
}
class MyClass implements MyInterface<string> {
open(data) {
// Data should be string, but is any
}
}
目前正确的做法如下:
open(data: string) {
...
}
然而,这迫使我多次输入类型,这似乎是不必要的。以下会产生错误(这是预期的):
open(data: number) {
...
}
任何不是字符串的类型都会出错,所以编译器难道不能推断出该类型是字符串吗?
这是一个 known issue in TypeScript,可能会在某个时候修复。
正如其他答案所说,这是 TypeScript 编译器的已知问题。
有一种方法可以提供 MyInterface
的实现,方法参数将被推断出来,您只需要使用 returns 一个对象而不是 class 的函数:
interface MyInterface<T> {
open(data: T): void
}
function createMyObject(): MyInterface<string> {
return {
open(data) { // data type is inferred as string here
const n = data.length;
}
}
}