TypeScript可让您定义一个既可调用又具有属性的接口:
interface FnWithProps {
(x: number): number;
a: string;
b: string;
}
这是创建可分配给该接口的值的一种方法:
function double(x: number) {
return x * x;
}
double.a = 'Hello';
double.b = 'Goodbye';
let f: FnWithProps = double; // ok
如果未设置double.a
或double.b
,则会触发错误。
是否可以直接构造这样的值,而无需通过中间变量或使用类型声明?
这不是有效的TypeScript,并会触发各种错误:
let g: FnWithProps = {
(x: number) => x,
a: 'Hello',
b: 'Goodbye',
};
答案 0 :(得分:1)
我认为中间解决方案可能也是最好的,因为它也可以很好地处理重载,但是您也可以使用Object.assign
来获得类似的效果:
let f: FnWithProps = Object.assign(function double(x: number) {
return x * x;
},{
a : 'Hello',
b : 'Goodbye'
});
尽管这确实意味着我们无法对函数参数或属性进行推断。
如果这是您的常见情况,我们可以构建一个实用程序函数来推断所有内容:
interface FnWithProps {
(x: number): number;
a: string;
b: string;
}
function functionWithProps<T extends (...a: any[]) => any>(fn: (...a: Parameters<T>) => ReturnType<T>, props: Pick<T, keyof T>){
return Object.assign(fn, props);
}
let f = functionWithProps<FnWithProps>(function double(x) { // annotation not necesary
return x * x;
},{
a : 'Hello', // helpful intelisense here
b : 'Goodbye'
});
答案 1 :(得分:0)
编辑:使用原始帖子中的 ...
# socket=MYSQL
port=3306
[mysql]
no-beep=
default-character-set=utf8
# default-character-set=
# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.=
#
# server_type=2
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
# The next three options are mutually exclusive to SERVER_PORT below.
# skip-networking=
# enable-named-pipe=
# shared-memory=
...
interface FnWithProps
这里要注意的是函数定义的interface FnWithProps {
(x: number): number;
a: number;
b: number;
}
const g:FnWithProps = (()=>{
const obj={
a:2,b:3,
func:function(x:number){ return this.a*x+this.b}
}
return obj.func.bind({a:obj.a,b:obj.b}) as FnWithProps
})()
console.log(g(1))
是this
。这是防止与此相关的错误所必需的。但是,从obj
中取出后,这个obj
就丢失了!所以用bind代替了。 (赋值也可以)。
顺便说一句,使用 this
的替代方法如下:
interface