ts中如何定义一个全局对象,就想cc对象一样

请教一下各位大神,如何在ts工程中定义一个全局对象,能够像cc一样,可以不用导入就能直接使用,还有智能提示。

function saySomething(something: string): void{
    cc.log(something);
}

class SomeClass{
    doSomething(): void{
        cc.log("Do something in some class.");
    }
}

(<any>window).saySomething = saySomething;
(<any>window).SomeClass = SomeClass;

然后就可以使用saySomething, SomeClass了

2赞

楼上 估计没懂楼主意思 重新定义一个 .d.ts 定义就Ok了
vscode 有联想功能的 自定义支持 和 cc一样的 直接照抄官方 creator.d.ts 创建一个 customDefine.d.ts (每次维护下) 进行导入要全局认识的方法就OK 如下示例

/** customDefine.d.ts */
declare module cc {	
        export var common: Common;
	export var other:OtherClass;
	export class Common {
	        a():void;
	        bb(str:string):string;
	        c(i:number);
	}
	export class OtherClass{
		a();
		b(s:number):number;
	}
}

/** Common.ts */
class Common {
	static a():void{
		// code...
	}
	static bb(str:string):string{
		// code...
		return "";
	}
	static c(i:number){
		// code...
	}
}
/** OtherClass.ts */
export default class OtherClass{
	a(){
		// code...
	}
	b(s:number):number{
		// code...
		return ++s;
	}
}

/** A.ts  测试文件*/
import {Common} from "Common.ts";
import OtherClass from "OtherClass.ts";
class A{
	cc.common = Common;
	cc.other = new OtherClass();
	cc.common.a();
	let str = cc.common.bb("");
	cc.other.a();
}

谢谢你的回答···不过你这样做有两个地方很不方便···一是没有代码提示,二是每次使用都要用(window).xxx的方式调用。我觉得还是不方便···我想了解如何能想cc对象一样。比如我定义一个mm全局对象,我在任何ts脚本中不用import就可以mm.xxx的方式来调用,而且还有代码提示。

如果你知道如何这样实现望给予回复,在此谢谢···

谢谢你的回复,您的这种方式可行,但是我尝试过只有在*.d.ts文件中declare module cc,然后在代码中通过cc.xxx.xxx的方式调用,这样多了前面的cc。我尝试直接在*.d.ts中declare module mm,然后运行代码,代码会报错,说mm没有定义。

我想要的效果是1:能够直接mm.xxx调用,2:有代码提示。如果您知道如何实现,望赐教,在此谢谢···

ts ,可以用静态变量。

不用写window,直接用,有代码提示的

/** TestClass.ts */

const {ccclass, property} = cc._decorator;
@ccclass
export default class TestClass extends cc.Component {
    onLoad() {
        saySomething("Yes you can");
        let sc = new SomeClass();
        sc.doSomething();
    }
}

我按照你的方式去实现···但是还是在vscode中报错了···

定义全局变量

global.xxx = xxxx;

这个global怎么定义的啊?

好吧,是在下输了。
请将我说的两个文件 原封不动 地放到项目里测试。
就你截图里面的写法,是无法代码提示的,
vscode根本就不知道window.xxx 是什么东西,他所做的代码提示是基于你ts文件里的函数或类定义代码的静态分析。
你删除我给的代码里
(<any>window).saySomething = saySomething;
一句,TestClass.ts文件中vscode照样会有saySomething的代码提示,因为vscode知道你定义了saySomething这个函数,但是不是全局的他是不知道的(当然删除这句之后运行会出错)。

根据 @oobwn的使用用法 在我项目中进行设置可以使用但是 vsCode没有联想提示
我对d.ts描述文件做了修改 应该符合楼主的要求了 有智能提示
我也是才用ts不久就看了一遍ts官方文档不知道有没根据ts文件自动生成d.ts描述文件的工具每次只能手动搬运了毕竟全局的地方少 看过过typings这个好像是下载d.ts的 谁知道 自动生成的麻烦私信告知一下我或者发个分享教程帖子 ((((((为啥我的@没有连接呀 不会用md 3个` 是代码格式化 :stuck_out_tongue_closed_eyes:))))

/** customDefine.d.ts */
declare class Common {
	static a():void;
	static bb(str:string):string;
	static c(i:number);
}
declare class OtherClass {}

/** Common.ts */
class Common {
	static a():void{
		// code...
	}
	static bb(str:string):string{
		// code...
		return "";
	}
	static c(i:number){
		// code...
	}
}
/** OtherClass.ts */
export default class OtherClass{ }

/** A.ts  测试文件*/
import {Common} from "Common.ts";
import OtherClass from "OtherClass.ts";
class A{
	(<any>window).Common = Common;
	(<any>window).OtherClass = OtherClass;
}
/**B.ts*/
class B{
	Common.a(); // B.ts 文件不用引用 也有智能提示
	let o = new OtherClass(); // B.ts 文件不用引用 也有智能提示
}

大佬ts全局变量的定义会了吗 能分享一份吗?

class youClassName {
static yourFunctionName () {}

}
(window).youClassName = youClassName;

在其他类里面直接用
youClassName.yourFunctionName()

方法都写成静态的啊?我不想这样写,有没有其他方法

如果想 在vscode里通过 window 点出属性,而没有报错的话
在.d.ts文件里面最外层加上一句:
interface Window { Network: any }
你就能在工程里面讲 window.Network 点出来了

突然看到这个帖子就想回复一下
可以使用 global.d.ts 新建一个这样的文件
这个叫扩展全局定义
具体写法,参考: 声明文件

但是除了写定义文件之外,你如果想调用而不报错,那就得给这个全局变量赋值

好用,支持下。不过最后一句有语病读着好难受呀

class _BB {}
// 命名空间声明,用于代码提示
declare global {
declare namespace nn {
let BB: typeof _BB;
}
}
// 命名空间实际定义
window[‘nn’] = window.nn || {};
nn.BB = _BB

1赞