我有一个用例,其中我在上面创建了一个绑定函数,或者只使用一个对象。
所以现在我有了这个界面:
export interface LMLockSuccessData {
(err: any, v: LMLockSuccessData): void
acquired: boolean,
lockUuid: string,
id: string
}
在某些情况下,我使用:
const fn = foo.bind(this, 'bar');
fn.id = 'bar';
fn.lockUuid = null;
fn.acquired = true;
或者我只是这样做:
{id: 'bar', lockUuid: null, acquired: true}
所以我的问题是,有没有办法使此行在界面中是可选的?
export interface LMLockSuccessData {
(err: any, v: LMLockSuccessData): void // make this optional?
acquired: boolean,
lockUuid: string,
id: string
}
使用问号不起作用:
(err: any, v: LMLockSuccessData)?: void
答案 0 :(得分:1)
您可以按如下方式构造这种类型。第一部分是包含普通属性的接口:
interface P {
acquired: boolean,
lockUuid: string,
id: string
}
然后选择函数类型:
interface F {
(err: any, v: LMLockSuccessData): void
}
最后,创建类型为属性或属性与函数的组合的。
type LMLockSuccessData = P | (P & F);
但是,我不确定这对您的用例当前是否有用。请注意,bind
当前不是强类型。它使用any
。 TypeScript is likely to fix this soon。
但是即使那样,打字可能还是没有帮助的。如果您编写一个打算与(P & F)
兼容的类型,但是函数声明错误(例如,缺少或多余的参数或错误的返回类型),则它仍将与P
兼容。因此,不正确的函数将是兼容的,恰恰是因为您将函数设为可选函数,并且 extra 函数重载是允许的(它们将被忽略)。