function sayName(params: {firstName: string; lastName?: string}) {
params.lastName = params.lastName || 'smith'; // <<-- any better alternative to this?
var name = params.firstName + params.lastName
alert(name);
}
sayName({firstName: 'bob'});
나는 이런 식으로 작동한다고 상상했다.
function sayName(params: {firstName: string; lastName: string = 'smith'}) {
분명히 이것이 명백한 주장이라면 다음과 같이 할 수 있습니다.
function sayName(firstName: string, lastName = 'smith') {
var name = firstName + lastName;
alert(name);
}
sayName('bob');
그리고 coffeescript에서 조건부 존재 연산자에 액세스 할 수 있습니다.
param.lastName ?= 'smith'
다음은 자바 스크립트로 컴파일됩니다.
if (param.lastName == null) {
param.lastName = 'smith';
}
답변
실제로는 간단한 방법이 있습니다. 다음 코드는 TypeScript 1.5에서 작동합니다.
function sayName({ first, last = 'Smith' }: {first: string; last?: string }): void {
const name = first + ' ' + last;
console.log(name);
}
sayName({ first: 'Bob' });
트릭은 먼저 key=value
기본적으로 인수 객체에서 선택하려는 키를 괄호로 묶는 것 입니다. 와 그 수행 :
과 유형 선언을.
이것은 온전한 params
객체 대신에 역 참조 된 변수를 가지고 있기 때문에 수행하려는 것과 약간 다릅니다 .
선택적으로 함수에 무엇이든 전달 ?
하려면 유형의 모든 키에 대해 a 를 추가 ={}
하고 유형 선언 뒤에 기본값을 추가하십시오 .
function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
var name = first + " " + last;
alert(name);
}
sayName();
답변
Typescript는 현재 기본 매개 변수를 지원합니다.
https://www.typescriptlang.org/docs/handbook/functions.html
또한 기본값을 추가하면 형식 선언을 기본값에서 유추 할 수 있으므로 형식 선언을 생략 할 수 있습니다.
function sayName(firstName: string, lastName = "Smith") {
const name = firstName + ' ' + lastName;
alert(name);
}
sayName('Bob');
답변
매개 변수 객체를 객체 제거 하는 것은 위의 많은 답변이 목표로하고 있으며 Typescript는 이제 훨씬 쉽게 읽고 직관적으로 이해할 수있는 방법을 갖추고 있습니다.
파괴 기본 사항 : 오브젝트를 파괴함으로써 키 이름으로 오브젝트에서 속성을 선택할 수 있습니다. 원하는만큼 속성을 정의 할 수 있으며 기본값은의 기본 구문으로 설정됩니다 let {key = default} = object
.
let {firstName, lastName = 'Smith'} = myParamsObject;
//Compiles to:
var firstName = myParamsObject.firstName,
_a = myParamsObject.lastName,
lastName = _a === void 0 ? 'Smith' : _a;
매개 변수 객체에 대한 인터페이스, 유형 또는 클래스를 작성하면 가독성이 향상됩니다.
type FullName = {
firstName: string;
/** @default 'Smith' */
lastName ? : string;
}
function sayName(params: FullName) {
// Set defaults for parameter object
var { firstName, lastName = 'Smith'} = params;
// Do Stuff
var name = firstName + " " + lastName;
alert(name);
}
// Use it
sayName({
firstName: 'Bob'
});
답변
아니요, TypeScript에는 하나의 기본값이 있고 다른 하나는 그렇지 않은 것처럼 정의 된 객체의 속성에 대한 기본값을 설정하는 자연스러운 방법이 없습니다. 보다 풍부한 구조를 정의 할 수 있습니다.
class Name {
constructor(public first : string,
public last: string = "Smith") {
}
}
인라인 유형 정의 대신 사용하십시오.
function sayName(name: Name) {
alert(name.first + " " + name.last);
}
불행히도 이와 같은 것을 할 수 없습니다 :
function sayName(name : { first: string; last?:string }
/* and then assign a default object matching the signature */
= { first: null, last: 'Smith' }) {
}
name
was 인 경우에만 기본값을 설정합니다 undefined
.
답변
이것은 긴 생성자를 포함하지 않는 좋은 방법 일 수 있습니다.
class Person {
firstName?: string = 'Bob';
lastName?: string = 'Smith';
// Pass in this class as the required params
constructor(params: Person) {
// object.assign will overwrite defaults if params exist
Object.assign(this, params)
}
}
// you can still use the typing
function sayName(params: Person){
let name = params.firstName + params.lastName
alert(name)
}
// you do have to call new but for my use case this felt better
sayName(new Person({firstName: 'Gordon'}))
sayName(new Person({lastName: 'Thomas'}))
답변
다음은 인터페이스를 사용하고 기본값으로 파괴하는 것입니다. “lastName”은 선택 사항입니다.
interface IName {
firstName: string
lastName?: string
}
function sayName(params: IName) {
const { firstName, lastName = "Smith" } = params
const fullName = `${firstName} ${lastName}`
console.log("FullName-> ", fullName)
}
sayName({ firstName: "Bob" })
답변
파괴하지 않고도 기본 매개 변수를 만들어 전달할 수 있습니다
interface Name {
firstName: string;
lastName: string;
}
export const defaultName extends Omit<Name, 'firstName'> {
lastName: 'Smith'
}
sayName({ ...defaultName, firstName: 'Bob' })