简而言之:有没有办法知道是否需要typescript参数和/或有默认值?
更长的版本:说我有以下文件:
//Foo.ts
class Bar {
foo(required:string,defaultValue:number=0,optional?:boolean) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道每个参数:
我已成功使用方法装饰用的打字稿反射API来获取参数类型,我用这个方法来获得他们的名字,但到目前为止,我还没有找到一个办法知道,如果一个变量需要和/或有一个默认值.
我知道typescript编译器本身可以在typescript中使用.所以我想知道是否有办法使用编译器的解析树来查看是否需要参数和/或是否有默认值?
那会怎么样?
我想写一个带有函数的通用包装器,并返回该函数的"异步样式"版本,如果它不是异步开始的话.
麻烦的是,没有简单的方法来知道呼叫是同步还是异步.所以...这基本上"无法完成".对?
(请注意,包装器应将同步函数协调为异步样式,并单独使用LEAVE异步函数)
var wrapper = function( fn ){
return function(){
var args = Array.prototype.splice.call(arguments, 0);
var cb = args[ args.length - 1 ];
// ?!?!?!?!?
// I cannot actually tell if `fn` is sync
// or async, and cannot determine it!
console.log( fn.toString() );
}
}
var f1Async = wrapper( function( arg, next ){
next( null, 'async' + arg );
})
var f2Sync = wrapper( function( arg ){
return 'sync' + arg;
})
f1Async( "some", function(err, ret …Run Code Online (Sandbox Code Playgroud) 任何人都可以帮助我如何检索功能参数名称?例如:
var A = function(a, b, c) {};
Run Code Online (Sandbox Code Playgroud)
我需要在函数外部获取参数名称,即a,b和c(就像字符串一样,例如放入数组[" a "," b "," c "]),所以我不仅可以验证类中对象/类属性的接口,还可以验证参数.
在此问题开始引起混淆之前,让我解释一下我的术语中的接口实现以及我需要上述问题的答案的原因:
首先,我发现了一种有趣的方式,我希望在JavaScript中使用Glen Ford实现接口:
for (var member in theInterface) {
if ( (typeof theObject[member] != typeof theInterface[member]) ) {
alert("object failed to implement interface member " + member);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
(请参阅http://knol.google.com/k/programming-to-the-interface-in-javascript-yes-it-can-be-done-er-i-mean-faked查看有关实施的详细信息#).
但是,上面的实现只验证对象属性(变量和方法),这对我来说是不够的.
我需要对参数级别进行更多验证,以便实现一个接口的代码应该遵循接口方法,并且也遵循接口方法中的参数.
PS.请不要争论为什么使用界面或为什么它无用或有用; 相反,如果您可以提供更好的接口实现,它是最有用的.这里的重点是我只需要知道如何获取函数参数名称.
是否可以像使用C# 中的属性那样注释 JavaScript 函数参数?
示例(C#):
public void DoSomething([RequiredAction(Action="some_action")] Client client) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
目的是 - 给定一个函数 - 使用反射来检查例如参数的“类型”并在调用它之前执行必要的转换。JavaScript确实是动态类型的,但例如可以使用注释来定义实例的“类型”,特定函数期望(例如,param应该是整数或数组)。
编辑:类型方面只是注释的一种可能用途。例如,还可以指定必须首先在该属性或方面(例如数组的最大允许长度)上运行特定函数。
人们当然可以使用这个答案并通过使用特定的参数前缀来注释参数。例如,匈牙利表示法在哪里sParam识别参数应该是一个字符串。但这并不是很方便,也不是那么可扩展,因为它需要指定名称。有没有更通用的方法来实现这一目标?
我想做这个: log(variableOrFunction)
能够产生这个:variableOrFunction: actualValue.
我试过这个:
export const log = (value) => {
console.log('' + value + ':', value)
console.log(value)
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个: [object Object]:
这样做的正确性是什么?
在 JavaScript 中,可以通过 获取传递给函数的参数列表arguments,这是一个类似数组的对象:
>> function fun(a, b, c) { console.log(arguments) };
undefined
>> fun(1, 2, 3);
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
有没有办法获得一个包含每个参数的正式名称的对象?
也就是说,如果调用上述函数,他应该得到:
{a = 1, b = 2, c = 3}
Run Code Online (Sandbox Code Playgroud) 谢谢阅读.
所以我正在开发我的第一个node.js应用程序.我对javascript比较熟悉但不够好.
我已经声明了一个类FOO,该方法调用了bars(index, value}一个接受2个参数的方法.为了使用它,在创建实例后,我有以下内容fooInstance.bars(3, 2)
我想把这种方法称为有点不同.如何更改我的FOO定义以便我可以像这样使用它fooInstance.bars(3).value?
我目前的代码如下
var util = require('util'),
events = require('events');
var FOO = function(opts) {
this.ipAddress = opts.ipAddress;
this.port = opts.port;
};
FOO.prototype = new events.EventEmitter;
module.exports = FOO;
FOO.prototype.bars = function (index, value) {
switch(index) {
case 1:
console.log("Apple " + " at " + value)
break;
case 2:
console.log("Banana, " + " at " + value)
break;
case 3:
console.log("Cherry, " + " at " …Run Code Online (Sandbox Code Playgroud) 可以检查函数是否需要/需要任何数据?
function one(){
}
function two(ineedvar){
}
Run Code Online (Sandbox Code Playgroud)
所以我需要函数,我想检查哪些需要var之间的().
假设我有一个函数(可能来自第三方库,假设我无法更改其定义),以及一个具有与函数参数匹配或重叠的属性的对象:
function fn(foo, bar, baz) { /* do stuff */ }
var obj = { foo: "yes", bar: 7, baz: false }
Run Code Online (Sandbox Code Playgroud)
有没有办法使用某种解构或扩展赋值或其他一些 ES6 功能来将对象属性应用为函数参数,或者我是否坚持单独指定每个参数?
fn(...obj); // Doesn't work
fn(obj.foo, obj.bar, obj.baz); // Convoluted but works
fn.apply(null, obj.values()); // Might work if you're lucky
Run Code Online (Sandbox Code Playgroud) 给定以下类型:
class Foo {
constructor(
private one: string,
private two: string,
private three: string) {
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能有一个数组,其值是类型的属性?
例如,我需要能够得到一个数组:
['一二三']
注意我需要从类型而不是实例中提取属性,否则我可以简单地使用Object.keys(instanceOfFoo).
javascript ×8
node.js ×2
reflection ×2
typescript ×2
annotate ×1
arguments ×1
asynchronous ×1
ecmascript-6 ×1