我對如何在打字稿中使用 OOP 感到有些困惑。
我習慣用 PHP 來做這件事。
1 - 我可以使用類作為型別而不必填充所有屬性值嗎?
2 - 我真的需要創建一個介面來創建類屬性并將其用作某些函式的型別嗎?
例如,這是我的課:
class User {
protected id: number;
protected name: string;
protected age?: Date;
constructor(id: number, name: string, age: Date) {
this.id = id;
this.name = name;
this.age = age;
getId() return this.id;
getName() return this.name;
setName(value: string) this.name = value;
getAge() return this.age;
setAge(value: Date) this.age = value;
}
這是我的服務功能:
const test = () => {
const user = new User({id: 1, name: 'Rick' });
}
我嘗試了很多方法,但都回傳了一些錯誤,這是主要的錯誤。
Type '{ id: string; name: string; }' is missing the following properties from type 'User': getId, getName, setName
我知道我可以用介面做到這一點,但如果可能的話,我正在尋找一種沒有介面的方法。
uj5u.com熱心網友回復:
您可以將實作減少到一行:
class User {
constructor(protected id: number, protected name: string, protected age?: Date) { }
}
// {
// "id": 1,
// "name": "2",
// "age": undefined
// }
const result = new User(1, '2') // ok
操場
uj5u.com熱心網友回復:
這個怎么樣...
class User {
protected id: number;
protected name: string;
protected age?: Date;
constructor({id, name, age }: { id: number, name: string, age?: Date }) {
this.id = id;
this.name = name;
this.age = age;
}
}
const user1 = new User({id: 1, name: 'Rick' });
const user2 = new User({id: 1, name: 'Rick', age: undefined });
const user3 = new User({id: 1, name: 'Rick', age: new Date() });
// const user4= new User({id: 1, name: 'Rick', age: new Date(), addProp: [] }); // <== Error
打字稿檔案確實有一個關于引數解構的部分
如果我們覺得它太冗長,我們可以type alias為建構式的引數型別定義一個,比如...
type UserParams = { id: number, name: string, age?: Date };
class User {
protected id: number;
protected name: string;
protected age?: Date;
constructor({id, name, age }: UserParams) {
this.id = id;
this.name = name;
this.age = age;
}
}
const user1 = new User({id: 1, name: 'Rick' });
const user2 = new User({id: 1, name: 'Rick', age: undefined });
const user3 = new User({id: 1, name: 'Rick', age: new Date() });
// const user4= new User({id: 1, name: 'Rick', age: new Date(), addProp: [] }); // <== Error
我們可以User在建構式引數中使用類作為型別,但問題是類的所有屬性User都被標記protected,并且帶有這些屬性名稱的傳入引數將出錯。但是,如果我們可以使這些屬性public,我們應該能夠實作我們想要的......
class User {
id: number; // <== protected modifier gone
name: string; // <== protected modifier gone
age?: Date; // <== protected modifier gone
constructor({ id, name, age }: User) {
this.id = id;
this.name = name;
this.age = age;
}
}
const user1 = new User({ id: 1, name: 'Rick' });
const user2 = new User({ id: 1, name: 'Rick', age: undefined });
const user3 = new User({ id: 1, name: 'Rick', age: new Date() });
// const user4 = new User({ id: 1, name: 'Rick', age: new Date(), addProp: [] }); // <== Error
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/476339.html
上一篇:繼承TypeError:__init__()接受1到2個位置引數,但給出了8個
下一篇:像打字稿一樣在飛鏢中創建界面
