TypeScript:如何将静态方法添加到内置 类
TypeScript: How to add static methods to built-in classes
有没有办法为 Date
、String
、Array
等类型添加一些静态方法?
例如我想将方法 today
添加到 Date
class 并且在 JavaScript 中我可以简单地添加一个 属性 或者我使用 Object.defineProperty:
Date.today = function(){
let date = new Date;
date.setHours(0,0,0,0);
return date;
}
Object.defineProperty(Date, 'today', { get() { ... }});
但无论如何我都没有通知 TypeScript
这个新的静态成员。
我是漏掉了什么还是我 google 弄错了?
您必须扩充 DateConstructor
接口以添加静态属性:
declare global {
interface DateConstructor {
today: () => Date
}
}
Date.today = function(){
let date = new Date;
date.setHours(0,0,0,0);
return date;
}
类似地为字符串和数组扩展 StringConstructor
和 ArrayConstructor
。参见 declaration merging。
我使用此代码通过静态方法扩展对象。
导出 class ObjectExtensions { }
declare global {
interface ObjectConstructor {
safeGet<T>(expresstion: () => T, defaultValue: T): T;
}
}
Object.safeGet = function <T>(expresstion: () => T, defaultValue: T): T {
try {
const value = expresstion();
if (value != null) return value;
} catch (e) {
}
return defaultValue;
}
在 main.ts 中你必须这样称呼 class
new ObjectExtensions();
然后你可以这样使用它:
Object.safeGet<number>(() => data.property.numberProperty);
有没有办法为 Date
、String
、Array
等类型添加一些静态方法?
例如我想将方法 today
添加到 Date
class 并且在 JavaScript 中我可以简单地添加一个 属性 或者我使用 Object.defineProperty:
Date.today = function(){
let date = new Date;
date.setHours(0,0,0,0);
return date;
}
Object.defineProperty(Date, 'today', { get() { ... }});
但无论如何我都没有通知 TypeScript
这个新的静态成员。
我是漏掉了什么还是我 google 弄错了?
您必须扩充 DateConstructor
接口以添加静态属性:
declare global {
interface DateConstructor {
today: () => Date
}
}
Date.today = function(){
let date = new Date;
date.setHours(0,0,0,0);
return date;
}
类似地为字符串和数组扩展 StringConstructor
和 ArrayConstructor
。参见 declaration merging。
我使用此代码通过静态方法扩展对象。 导出 class ObjectExtensions { }
declare global {
interface ObjectConstructor {
safeGet<T>(expresstion: () => T, defaultValue: T): T;
}
}
Object.safeGet = function <T>(expresstion: () => T, defaultValue: T): T {
try {
const value = expresstion();
if (value != null) return value;
} catch (e) {
}
return defaultValue;
}
在 main.ts 中你必须这样称呼 class
new ObjectExtensions();
然后你可以这样使用它:
Object.safeGet<number>(() => data.property.numberProperty);