我偶然发现了一个带有一些交集类型函数签名的打字稿定义文件。它们来自文件@types/cropppie
中的index.d.ts
:
result(options: ResultOptions & { type: 'base64' }): Promise<string>;
result(options: ResultOptions & { type: 'html' }): Promise<HTMLElement>;
result(options: ResultOptions & { type: 'blob' }): Promise<Blob>;
result(options: ResultOptions & { type: 'canvas' }): Promise<HTMLCanvasElement>;
result(options?: ResultOptions): Promise<HTMLCanvasElement>;
我无法使用result
调用函数type: 'base64'
,因此typescript编译器正确地将返回值标识为Promise<string>
。
当调用
时const opts = new ResultOptions(...);
result({...opts, ...{type: 'base64'}}).then(data => ...);
typescript编译器将data
标识为HTMLCanvasElement
,但确实是base64编码的字符串。
有人可以指出如何正确传递参数,因此typescript编译器会将data
标识为字符串吗?
非常感谢提前。
答案 0 :(得分:1)
我猜这个问题与准备传递给结果函数的params的方式有关。我已经改变了一点这个准备,看起来你提到的代码开始工作了。而不是:
{...opts, ...{type: 'base64'}}
我写道:
{ ...opts, type: 'base64' }
您可以在Playground site上查看我的示例。
以下是该示例的完整代码:
class ResultOptions {
param1: any;
}
class ClassA {
result(options: ResultOptions & { type: 'base64' }): Promise<string>;
result(options: ResultOptions & { type: 'html' }): Promise<HTMLElement>;
result(options: ResultOptions & { type: 'blob' }): Promise<Blob>;
result(options: ResultOptions & { type: 'canvas' }): Promise<HTMLCanvasElement>;
result(options?: ResultOptions): Promise<HTMLCanvasElement>;
result(options?: ResultOptions): Promise<any> {
if ((options as any).type === "base64") {
return new Promise<string>(
(resolve) => {
resolve("some string");
}
);
} else {
return new Promise<any>(
(resolve) => {
resolve({});
}
);
}
}
}
const opts = new ResultOptions();
const instanceA = new ClassA();
instanceA.result({ ...opts, type: 'base64' })
.then(
(data: string) => {
alert("data(string): " + data);
}
);
instanceA.result(opts)
.then(
(data: any) => {
alert("data(any): " + data);
}
);