在打字稿中为泛型函数编写 JSdoc
Write JSdoc for generic function in typescript
我用以下代码提炼出了我的问题的本质:
我有 Base class,还有 Derived,Derived2:
class Base {
static get type() {
return 'Base';
}
}
class Derived extends Base {
}
class Derived2 extends Base {
}
现在我有了变量 t,它可以是 Derived 或 Derived2 的一个实例。它也可以在运行时多次更改。
/** @type {Base} */
var t = new Derived();
//or
var t = new Derived2();
我有一个函数可以检查 t 是否是已传递的 class 的实例,如果它是已传递的 class 的实例,则 returns t 否则未定义。
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {T} /// <-- I can't figure out how to return an instance of T
* @returns {instanceof T} /// it's hypothetical, but I need this..
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
当我调用 checkTop( Derived ) 时,它的 return 类型应该是 Derived。但是上面的jsdoc,它的return类型是'typeof Derived'。
但是我想让 return 类型只是 'Derived'.
let d1 = checkTop( Derived ); // 'typeof Derived', but I want 'Derived' as return type
同样,d2 被识别为 'typeof Derived2'
let d2 = checkTop( Derived2 ); // 'typeof Derived2'.. but I want 'Derived2' as return type
如何在 JSDOC 中指定 return 类型,以便 checkTop( Derived );
的 return 类型为 Derived
,而 checkTop( Derived2 )
的 [=56] =] 类型是 'Derived2'.
我尝试按照 return 类型进行操作:
/**
* @template {Base} B
* @template {typeof B} T
* @param {T} cl
* @returns {B}
*/
function checkTop( cl )
和
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {instanceof T}
*/
function checkTop( cl )
如果在 JSDOC 中不可能,但在打字稿中可能,那也会有帮助,但我更喜欢 JSDOC 解决方案。
我可能误解了这里的问题,但我认为你只需要 return cl 而不是 returning t:
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {T} /// <-- I can't figure out how o return an instance of T
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return cl;
}
return undefined;
}
你已经问过至少在 TypeScript 中是否可行。是的。只需删除您的 JSDoc 评论,您就会得到您正在寻找的建议。
为了清除,您可以只发表评论,只说明它的内容 returns。够了。
您只是通过断言重写了正确的 TypeScript 建议(程序员的意见被认为比 TypeScript 的建议更重要,因为程序员在明确指定某些内容时知道他在做什么)。
所以我在互联网上阅读了 jsdocs,这是我的结论
我找到了需要的结果
看到截图高兴,问题解决
那么在 jsDocs 中有什么帮助
/**
* @typedef {Object}
* @param {c1}
*/
这里是代码片段
class Base {
static get type() {
return 'Base';
}
}
class Derived extends Base {
}
class Derived2 extends Base {
}
var t = new Derived();
var t1 = new Derived2();
/**
* @typedef {Object}
* @param {c1}
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
/**
* @typedef {Object}
* @param {c1}
*/
function checkTop2( cl ) {
if ( t1 instanceof cl ) {
return t1;
}
return undefined;
}
var d1 = checkTop(Derived);
var d2 = checkTop2(Derived2);
您可以尝试使用 Typescript Generics
来实现您想要实现的目标,最好使用 Typescript 功能而不是 JSDOCS
尝试下面的代码,它工作正常。
class Base
{
static get type() {
return 'Base';
}
}
class Derived extends Base {}
class Derived2 extends Base {}
var t : Derived = new Derived();
var t1 : Derived2= new Derived2();
function checkTop <GT>(genericValue: GT){
return genericValue;
}
var d1 = checkTop(t);
var d2 = checkTop(t1);
或
在花了一些时间学习 TypeScript 之后,我开始了解我们 type
declare type A = { id: string }
declare type B = { name: string }
function get<T>(obj: T): T {
return obj;
}
var obj1: A = {id : "Jarvis"};
var obj2: B = {name : "Tony Stark"};
var objectTypeA = get(obj1);
var objectTypeB = get(obj2);
将模板定义为您需要的类型 return 并将参数定义为该类型的构造函数
/**
* @template {Base} T
* @param {new T} cl
* @returns {T}
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
结果将是:
function checkTop<T extends Base>(cl: new () => T): T
我是这样实现的...构造函数类型应键入 {new() => T}
/**
* @template {Base} T
* @param {new() => T} cl
* @returns {T}
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t
}
// You should always return an instance
// of cl unless the return type is {?T}
return new cl()
}
我用以下代码提炼出了我的问题的本质:
我有 Base class,还有 Derived,Derived2:
class Base {
static get type() {
return 'Base';
}
}
class Derived extends Base {
}
class Derived2 extends Base {
}
现在我有了变量 t,它可以是 Derived 或 Derived2 的一个实例。它也可以在运行时多次更改。
/** @type {Base} */
var t = new Derived();
//or
var t = new Derived2();
我有一个函数可以检查 t 是否是已传递的 class 的实例,如果它是已传递的 class 的实例,则 returns t 否则未定义。
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {T} /// <-- I can't figure out how to return an instance of T
* @returns {instanceof T} /// it's hypothetical, but I need this..
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
当我调用 checkTop( Derived ) 时,它的 return 类型应该是 Derived。但是上面的jsdoc,它的return类型是'typeof Derived'。 但是我想让 return 类型只是 'Derived'.
let d1 = checkTop( Derived ); // 'typeof Derived', but I want 'Derived' as return type
同样,d2 被识别为 'typeof Derived2'
let d2 = checkTop( Derived2 ); // 'typeof Derived2'.. but I want 'Derived2' as return type
如何在 JSDOC 中指定 return 类型,以便 checkTop( Derived );
的 return 类型为 Derived
,而 checkTop( Derived2 )
的 [=56] =] 类型是 'Derived2'.
我尝试按照 return 类型进行操作:
/**
* @template {Base} B
* @template {typeof B} T
* @param {T} cl
* @returns {B}
*/
function checkTop( cl )
和
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {instanceof T}
*/
function checkTop( cl )
如果在 JSDOC 中不可能,但在打字稿中可能,那也会有帮助,但我更喜欢 JSDOC 解决方案。
我可能误解了这里的问题,但我认为你只需要 return cl 而不是 returning t:
/**
* @template {typeof Base} T
* @param {T} cl
* @returns {T} /// <-- I can't figure out how o return an instance of T
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return cl;
}
return undefined;
}
你已经问过至少在 TypeScript 中是否可行。是的。只需删除您的 JSDoc 评论,您就会得到您正在寻找的建议。
为了清除,您可以只发表评论,只说明它的内容 returns。够了。
您只是通过断言重写了正确的 TypeScript 建议(程序员的意见被认为比 TypeScript 的建议更重要,因为程序员在明确指定某些内容时知道他在做什么)。
所以我在互联网上阅读了 jsdocs,这是我的结论 我找到了需要的结果
看到截图高兴,问题解决
那么在 jsDocs 中有什么帮助
/**
* @typedef {Object}
* @param {c1}
*/
这里是代码片段
class Base {
static get type() {
return 'Base';
}
}
class Derived extends Base {
}
class Derived2 extends Base {
}
var t = new Derived();
var t1 = new Derived2();
/**
* @typedef {Object}
* @param {c1}
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
/**
* @typedef {Object}
* @param {c1}
*/
function checkTop2( cl ) {
if ( t1 instanceof cl ) {
return t1;
}
return undefined;
}
var d1 = checkTop(Derived);
var d2 = checkTop2(Derived2);
您可以尝试使用 Typescript Generics
来实现您想要实现的目标,最好使用 Typescript 功能而不是 JSDOCS
尝试下面的代码,它工作正常。
class Base
{
static get type() {
return 'Base';
}
}
class Derived extends Base {}
class Derived2 extends Base {}
var t : Derived = new Derived();
var t1 : Derived2= new Derived2();
function checkTop <GT>(genericValue: GT){
return genericValue;
}
var d1 = checkTop(t);
var d2 = checkTop(t1);
或
在花了一些时间学习 TypeScript 之后,我开始了解我们 type
declare type A = { id: string }
declare type B = { name: string }
function get<T>(obj: T): T {
return obj;
}
var obj1: A = {id : "Jarvis"};
var obj2: B = {name : "Tony Stark"};
var objectTypeA = get(obj1);
var objectTypeB = get(obj2);
将模板定义为您需要的类型 return 并将参数定义为该类型的构造函数
/**
* @template {Base} T
* @param {new T} cl
* @returns {T}
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t;
}
return undefined;
}
结果将是:
function checkTop<T extends Base>(cl: new () => T): T
我是这样实现的...构造函数类型应键入 {new() => T}
/**
* @template {Base} T
* @param {new() => T} cl
* @returns {T}
*/
function checkTop( cl ) {
if ( t instanceof cl ) {
return t
}
// You should always return an instance
// of cl unless the return type is {?T}
return new cl()
}