假设我想在 TypeScript 中实现类型化函数链,但在这种情况下,调用函数会从返回类型中删除该函数。例如:
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
interface Chainable {
execute: () => Promise<void>;
}
interface Chain1 extends Chainable {
chain1?: () => Omit<this, 'chain1'>;
}
interface Chain2 extends Chainable {
chain2?: () => Omit<this, 'chain2'>;
}
let chain: Chain1 & Chain2 = {
execute: () => null,
chain1: () => {
delete chain.chain1;
return chain;
},
chain2: () => {
delete chain.chain2;
return chain;
}
};
chain.chain1().chain2().execute(); // Using the function chain
Run Code Online (Sandbox Code Playgroud)
当我调用 时chain.chain1() …
我有一个非常复杂的对象,我用它来模拟 DataTable() 对象以进行测试。
const obj = {
DataTable: () => {
return {
columns: () => {
return {
data: () => {
return {
eq: () => {
return {
indexOf: jest.fn(),
};
},
};
},
visible: () => {
return jest.fn();
},
};
},
};
},
};
Run Code Online (Sandbox Code Playgroud)
在我的测试代码中,我试图监视其中一些函数,但它总是返回未定义。有没有办法模拟深层嵌套函数的返回值?
jest.spyOn(obj.DataTable().columns().data().eq(), 'indexOf').mockReturnValue('test');
console.log(obj.DataTable().columns().data().eq().indexOf()); // returns undefined, should return 'test'
Run Code Online (Sandbox Code Playgroud) 可能重复:
PHP方法链接?
我偶尔会看到一些php应用程序使用这样的类:
$Obj = new Obj();
$Obj->selectFile('datafile.ext')->getDATA();
Run Code Online (Sandbox Code Playgroud)
上面的例子获取所选文件的内容然后返回它们(只是一个例子);
好吧,在我决定问你怎么做之前,我试过这个:
class Someclass {
public function selectFile( $filename ) {
$callAclass = new AnotherClass( $filename );
return $callAclass;
}
// Other functions ...
}
class AnotherClass {
protected $file_name;
public function __construct ( $filename ) { $this->file_name = $filename; }
public function getDATA ( ) {
$data = file_get_contents( $this->file_name );
return $data;
}
// funcs , funcs, funcs ....
}
Run Code Online (Sandbox Code Playgroud)
这是完成这项任务的正确方法吗?请告诉我这些课程的名称.
如果Array.prototype.filter返回一个数组,为什么我不能push()立即调用这个返回值?
例:
var arr = ["a", "ab", "c", "ad"];
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; });
// result: ["a", "ab", "ad"]
arr2.push("aaa");
// result: ["a", "ab", "ad", "aaa"]
Run Code Online (Sandbox Code Playgroud)
好到目前为止.
但是那个push()电话号码的链接filter()呢?
var arr = ["a", "ab", "c", "ad"];
var arr2 = arr.filter(function(elmnt) { return elmnt.indexOf("a") > -1; }).push("aaa");
// result: 4
Run Code Online (Sandbox Code Playgroud)
为什么链接filter()并push()导致我期望的元素数量,而不是这些元素的数组?
鉴于以下类:
struct Object {
int x, y;
void addtoall( int value ){ x += value; y += value; };
Object& addtoall( int value ){ x += value; y += value; return *this; };
};
Run Code Online (Sandbox Code Playgroud)
这两个成员函数有什么区别?
我知道对于某些运算符重载(例如: operator+= )需要返回对 self 的引用,但不包括运算符重载,是否有必要?如果没有,您什么时候想要或需要返回对 self 的引用而不是返回 void?
如果这可以通过 google-fu 找到,或者是一个非常基本的问题,我深表歉意,但我不确定究竟要搜索什么(而不是因为缺乏尝试)。
我试图弄清楚如何让它正常工作:
class A {
john(): B {
return this; // <-- ERROR HERE
}
}
class B extends A {
joe(): B {
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可以做方法链接:
let instance = new B();
instance.john().joe();
Run Code Online (Sandbox Code Playgroud)
当然,TypeScript抱怨this与B的类型不匹配.
在重塑和查询我在 pandas 中的数据时,我使用了很多方法链DataFrames。有时会为 in 索引(行)和列创建额外的和不必要的级别。如果是这样,例如在索引(行轴)上,可以使用以下方法轻松解决DataFrame.reset_index():
df.query('some query')
.apply(cool_func)
.reset_index('unwanted_index_level',drop=True) # <====
.apply(another_cool_func)
Run Code Online (Sandbox Code Playgroud)
该reset_index函数允许继续链方法并继续使用DataFrame.
尽管如此,我从未找到 column_axis 的等效解决方案。有吗?
我想知道方法链接和流畅接口之间的确切区别。据我了解,方法链只是运行先前方法返回对象的方法,同时避免临时变量。这方面的一个例子可能是
Integer.parseInt(str).intValue()
Run Code Online (Sandbox Code Playgroud)
相对于流式接口,对象的每个方法都由一个点链接起来,而不必与前一个方法相关这两种技术使修饰符方法返回到宿主对象,以便可以在单个表达式中调用多个修饰符,如下所示:
new Car().StartsEngine().OpenWindow()
Run Code Online (Sandbox Code Playgroud)
它是否正确?
在使用 pandas 方法链接时,是否有一种简单的通用方法可以使方法以 if 语句为条件?
模拟示例:
df = pd.DataFrame({'A':['one', 'two'], 'B':['one', 'two']})
change_to_numeric = False
df = (df
.query("A == 'one'")
.replace('one', 1) # <-- Execute this row only "if change_to_numeric == True"
)
Run Code Online (Sandbox Code Playgroud)
谢谢你!
当使用流畅的API编程或只使用方法链接时,我看到的风格大多是这样的:
var obj = objectFactory.CreateObject()
.SetObjectParameter(paramName, value)
.SetObjectParameter(paramName, value)
.DoSomeTransformation();
Run Code Online (Sandbox Code Playgroud)
将点放在行的开头而不是行的末尾的原因是什么:
var obj = objectFactory.CreateObject().
SetObjectParameter(paramName, value).
SetObjectParameter(paramName, value).
DoSomeTransformation();
Run Code Online (Sandbox Code Playgroud)
或者,这只是团队达成共识的风格吗?
method-chaining ×10
chaining ×2
class ×2
javascript ×2
pandas ×2
python ×2
typescript ×2
arrays ×1
c# ×1
c++ ×1
coding-style ×1
filtering ×1
fluent ×1
if-statement ×1
jestjs ×1
multi-index ×1
object ×1
oop ×1
php ×1
reference ×1
unit-testing ×1
void ×1