我在TypeScript中有以下接口:
interface IX {
a: string,
b: any,
c: AnotherType
}
我声明了一个该类型的变量并初始化了所有属性
let x: IX = {
a: 'abc',
b: null,
c: null
}
然后在稍后的init函数中为它们赋值
x.a = 'xyz'
x.b = 123
x.c = new AnotherType()
但我不喜欢在声明对象时为每个属性指定一堆默认空值,因为它们稍后将被设置为实值。我能告诉接口默认属性我不提供为空吗?是什么让我这样做:
let x: IX = {
a: 'abc'
}
而不会产生编译器错误。现在它告诉我了
TS2322:类型“{}”不能赋值给类型
“九”。属性“b”在类型“{}”中缺失。
我的解决方案:
我在对象上创建了包装器。指派以修复键入问题。
export function assign<T>(...args: T[] | Partial<T>[]): T {
return Object.assign.apply(Object, [{}, ...args]);
}
用法:
env.base.ts
export interface EnvironmentValues {
export interface EnvironmentValues {
isBrowser: boolean;
apiURL: string;
}
export const enviromentBaseValues: Partial<EnvironmentValues> = {
isBrowser: typeof window !== 'undefined',
};
export default enviromentBaseValues;
env.dev.ts
import { EnvironmentValues, enviromentBaseValues } from './env.base';
import { assign } from '../utilities';
export const enviromentDevValues: EnvironmentValues = assign<EnvironmentValues>(
{
apiURL: '/api',
},
enviromentBaseValues
);
export default enviromentDevValues;
另一种方法是使用Pick实用程序类型并选择您希望设置为必需的属性。
interface IX {
a: string,
b: any,
c: AnotherType
}
let x: Pick<IX, 'a'> = {
a: 'abc'
}
然后当你想要声明真正的IX对象时,你只需将默认值与新值合并,如下所示:
const newX: IX = {
...x,
b: 'b',
c: () => {}
}
这个答案摘自“如何设置TypeScript接口的默认值?”
这要看情况和用法而定。通常,在TypeScript中,接口没有默认值。
如果您不使用默认值
你可以声明x为:
let x: IX | undefined; // declaration: x = undefined
然后,在你的init函数中,你可以设置实值:
x = {
a: 'xyz'
b: 123
c: new AnotherType()
};
这样,x可以是undefined或defined - undefined表示对象未初始化,如果不需要默认值,则不设置默认值。这在逻辑上比定义“垃圾”要好。
如果你想部分赋值对象:
你可以用可选属性定义类型,比如:
interface IX {
a: string,
b?: any,
c?: AnotherType
}
在这种情况下,您只需要设置a。其他类型用?这意味着它们是可选的,并具有未定义的默认值。
甚至
let x: Partial<IX> = { ... }
这使得所有字段都是可选的。
在任何情况下,你都可以使用undefined作为默认值,这只是取决于你的用例。
我的解决方案:
我在对象上创建了包装器。指派以修复键入问题。
export function assign<T>(...args: T[] | Partial<T>[]): T {
return Object.assign.apply(Object, [{}, ...args]);
}
用法:
env.base.ts
export interface EnvironmentValues {
export interface EnvironmentValues {
isBrowser: boolean;
apiURL: string;
}
export const enviromentBaseValues: Partial<EnvironmentValues> = {
isBrowser: typeof window !== 'undefined',
};
export default enviromentBaseValues;
env.dev.ts
import { EnvironmentValues, enviromentBaseValues } from './env.base';
import { assign } from '../utilities';
export const enviromentDevValues: EnvironmentValues = assign<EnvironmentValues>(
{
apiURL: '/api',
},
enviromentBaseValues
);
export default enviromentDevValues;