作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想定义一个随处可用的全局函数,使用时不需要导入模块。
此函数旨在替换 C# 中可用的安全导航运算符 (?)。为了可读性,我不想在函数前加上模块名称。
Global.d.ts:
declare function s<T>(someObject: T | null | undefined, defaultValue?: T | null | undefined) : T;
全局.tsx:
///<reference path="Global.d.ts" />
export function s<T>(object: T | null | undefined, defaultValue: T | null = null = {} as T) : T {
if (typeof object === 'undefined' || object === null)
return defaultValue as T;
else
return object;
}
App.tsx(根 TypeScript 文件):
import 'Global';
其他TSX文件(方法使用):
s(s(nullableVar).member).member; //Runtime error
这可以正常编译,但是在浏览器中会抛出“s is not a function
”。
最佳答案
您正在为编译器定义类型,但实际上并没有将其附加到全局命名空间——浏览器中的 window
,node 中的 global
。不是从模块中导出它,而是附加它。对于同构使用,使用类似...
function s() { ... }
// must cast as any to set property on window
const _global = (window /* browser */ || global /* node */) as any
_global.s = s
您也可以放弃 .d.ts
文件并使用 declare global
在同一文件中声明类型,例如
// we must force tsc to interpret this file as a module, resolves
// "Augmentations for the global scope can only be directly nested in external modules or ambient module declarations."
// error
export {}
declare global {
function s<T>(someObject: T | null | undefined, defaultValue?: T | null | undefined) : T;
}
const _global = (window /* browser */ || global /* node */) as any
_global.s = function<T>(object: T | null | undefined, defaultValue: T | null = null) : T {
if (typeof object === 'undefined' || object === null)
return defaultValue as T;
else
return object;
}
关于typescript - 如何在 TypeScript 中定义全局函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47736473/
我是一名优秀的程序员,十分优秀!